我是相對較新的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如上所示。看到
我沒能得到同樣的事情在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。
謝謝
瑞安
我建議Databrick指南完成後:
我本指南自己導入到環境和能夠得到一個類似的例子工作沒有問題。
我發現了一個令人滿意的解決方案。而不是使用一個返回類型的數組(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中/火花。
任何想法嗎?