2017-09-19 21 views
0

我試圖根據現有列將數據添加到我的數據框中,其中數據是自定義對象的數組。 假設對象類型是MyObject來,我試圖做這樣的事情:Apache Spark Java - 如何在類型是對象數組時獲取TypedColumn?

Column col = df.col("old_col"); 
Encoder<MyObject[]> encoder = Encoders.bean(MyObject[].class); 
TypedColumn<Object, MyObject[]> typedColumn = col.as(encoder); 
df = df.withColumn("new_col",functions.callUDF("my_udf", typedColumn)); 

我收到以下異常:

Caused by: java.lang.AssertionError: assertion failed 
    at scala.Predef$.assert(Predef.scala:156) ~[scala-library-2.11.8.jar:?] 
    at org.apache.spark.sql.catalyst.encoders.ExpressionEncoder$.javaBean(ExpressionEncoder.scala:87) ~[spark-catalyst_2.11-2.2.0.jar:2.2.0] 
    at org.apache.spark.sql.Encoders$.bean(Encoders.scala:142) ~[spark-catalyst_2.11-2.2.0.jar:2.2.0] 

,因爲該類型必須是StructType,它是數組類型。

如何獲得輸入的對象在我的UDF中使用?

回答

0

我最終使用的解決方案是使用functions.to_json函數將列值作爲JSON字符串發送,並在UDF內反序列化對象。

調用UDF的樣子:

df = df.withColumn("new_col",functions.callUDF("my_udf",functions.to_json(df.col("old_col")))); 

而在UDF的定義,它看起來像:

MyObject[] objArray = new Gson().fromJson(jsonStr, MyObject[].class); 
相關問題