取消
顯示的結果
而不是尋找
你的意思是:

我怎麼注冊一個UDF返回一個數組的元組在scala中/火花嗎?

kelleyrw
新的貢獻者二世

我是相對較新的Scala。在過去,我能夠做以下python:

def foo (p1, p2):進口datetime dt dt。datetime(2014 4, 17日,12日,34)結果= [(1," 1 ",1.1,dt。datetime(2014 4, 17歲,1,0)),(2,“2”,2.2,dt。datetime(2014 4, 17歲,2 0)),(3,“3”,3.3,dt。datetime(2014 4 17 3 0)))返回結果

現在我注冊一個UDF:

從pyspark.sql。類型導入*模式= ArrayType (StructType ([StructField (int, IntegerType(),假),StructField(“字符串”,StringType(),假),StructField(“浮動”,IntegerType(),假),StructField (datetime, TimestampType(),假))))sqlContext。registerFunction (foo,“foo”模式)

最後,我打算如何使用它:

sqlContext。sql(" " "選擇a.foo_output.int f_int, a.foo_output。浮動f_float, a.foo_output。字符串作為f_string a.foo_output。datetime f_datetime從(選擇爆炸(foo (7)) foo_output)”“”),告訴()

這實際工作pyspark如上所示。看到

0693年f000007oohdaak

我沒能得到同樣的事情在scala中工作。誰能告訴我正確的方法在scala中/火花。當我試圖注冊模式:

def foo (p1:整數,p2:整數):數組(Tuple4 [Int、字符串、浮點數、時間戳]]= {val數組結果= ((1“1”1.1 f,新的時間戳(1 2014 4,17日,0,0,0)),(2,“2”,2.2 f,新的時間戳(2 2014,17日,0,0,0)),(3“3”3.3 f,新的時間戳(3 2014,17日,0,0,0)));返回結果;}/ /注冊火花val foo_schema = ArrayType (StructType(數組(StructField (“int”、IntegerType假),StructField (StringType“字符串”,假),StructField(“浮動”,FloatType假),StructField (datetime, TimestampType、虛假))));sql_context.udf。注冊(" foo " foo _);

我得到了一個運行時錯誤:

org.apache.spark.sql。AnalysisException:沒有這種結構體字段int _1, _2、離子、_4;線2 pos 4

從錯誤消息,很明顯我沒有附上正確的模式確實在上麵的代碼中,我告訴火花。所以我試著以下:

sql_context.udf。注冊(“foo”, foo _ foo_schema);

然而,它給了我一個編譯器錯誤:

(錯誤)/用戶/ rykelley /開發/ rovi / IntegralReach-Main / ADW / rovi-master-schedule / src / main / scala /com/rovicorp/adw/RoviMasterSchedule/BuildRoviMasterSchedule。scala: 247:錯誤:重載方法價值登記的替代品:[信息](名字:字符串,f: org.apache.spark.sql.api.java。UDF22 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF21 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF20 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF19 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF18 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF17 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF16 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF15 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF14 [_, _, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF13 [_, _, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF12 [_, _, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF11 [_, _, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF10 [_, _, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF9 [_, _, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF8 [_, _, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF7 [_, _, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF6 [_, _, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF5 [_, _, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF4 [_, _, _, _, _], returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF3 _, _, _, _, returnType org.apache.spark.sql.types.DataType): <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF2 _, _, _, returnType: org.apache.spark.sql.types.DataType) <和>[信息](單位名稱:字符串,f: org.apache.spark.sql.api.java。UDF1 _, _, returnType: org.apache.spark.sql.types.DataType)單元[信息]不能用於(字符串、數組(整數,整數)= >[(整數、字符串、浮點數、java.sql.Timestamp)], org.apache.spark.sql.types.ArrayType)

誰能告訴我正確的方向嗎?

注意:使用火花1.6.1。

謝謝

瑞安

1接受解決方案

接受的解決方案

米克羅斯
貢獻者

我建議Databrick指南完成後:

https://docs.cloud.m.eheci.com/docs/latest/databricks_guide/index.html 20 sql, 04% % 20 dataframes % 20%…

我本指南自己導入到環境和能夠得到一個類似的例子工作沒有問題。

在原帖子查看解決方案

7回複7

米克羅斯
貢獻者

我建議Databrick指南完成後:

https://docs.cloud.m.eheci.com/docs/latest/databricks_guide/index.html 20 sql, 04% % 20 dataframes % 20%…

我本指南自己導入到環境和能夠得到一個類似的例子工作沒有問題。

kelleyrw
新的貢獻者二世

並不回答我的問題,因為這些例子沒有的情況下,返回類型是數組的元組。你能分享你的解決方案嗎?

kelleyrw
新的貢獻者二世

我發現了一個令人滿意的解決方案。而不是使用一個返回類型的數組(Typle4 […]],我使用一個類來創建一個簡單的結構:

case類的結果(f_int: Int, f_string:字符串,f_float:浮動,f_ts:時間戳);def foo2 (p1:整數,p2:整數):數組[結果]= {val =結果數組(結果(1“1”1.1 f,新的時間戳(1 2014 4,17日,0,0,0)),結果(2“2”2.2 f,新的時間戳(2 2014,17日,0,0,0)),結果(3“3”3.3 f,新的時間戳(3 2014,17日,0,0,0)));返回結果;}sqlContext.udf。注冊(“foo2 foo2 _);sqlContext。sql(“”“選擇a.foo_output。f_int f_int, a.foo_output。f_float f_float, a.foo_output。f_string f_string, a.foo_output。f_ts as f_datetime from (select explode(foo2(1, 7)) as foo_output) a """).show()

這似乎給所需的輸出和pyspark是一樣的。

我還好奇如何顯式返回一個元組的數組。我明白了在pyspark工作這一事實提供證據的存在方式來完成同樣的事情在scala中/火花。

任何想法嗎?

kelleyrw
新的貢獻者二世

任何響應嗎?提供的鏈接沒有回答這個問題。

歡迎來到磚社區:讓學習、網絡和一起慶祝

加入我們的快速增長的數據專業人員和專家的80 k +社區成員,準備發現,幫助和合作而做出有意義的聯係。

點擊在這裏注冊今天,加入!

參與令人興奮的技術討論,加入一個組與你的同事和滿足我們的成員。

Baidu
map