火花udf返回相同的元素引发结构数组错误

时间:2018-12-04 13:25:47

标签: apache-spark apache-spark-sql user-defined-functions apache-spark-2.1

我的spark版本是2.1.0。我只是在数组上执行虚拟操作,即使用以下udf定义返回它。但是,它不起作用!/

val df = spark.read.format("csv").load("trans.txt").toDF("id", "dt", "amt")
val df2 = df.groupBy("id").agg(collect_list(struct('dt,'amt)).as("trans_vec"))
df2.show(false)
df2.printSchema()

def gen_rows(x:Seq[(String,String)]):Seq[(String,String)]={
  x
}
val udf_gen_rows = udf( gen_rows(_:Seq[(String,String)]):Seq[(String,String)] )

df2.withColumn("row_number",udf_gen_rows('trans_vec)).show(false)

它抛出以下错误

Exception in thread "main" org.apache.spark.sql.AnalysisException: cannot resolve 'UDF(trans_vec)' due to data type mismatch: argument 1 requires array<struct<_1:string,_2:string>> type, however, '`trans_vec`' is of array<struct<dt:string,amt:string>> type.;;

如何解决此问题?。

1 个答案:

答案 0 :(得分:-1)

如果将下面的代码替换为

,它将起作用
val df2 = df.groupBy("id").agg(collect_list(struct('dt,'amt)).as("trans_vec"))

val df2 = df.groupBy("id").agg(collect_list(struct('dt.as("_1"),'amt.as("_2")).as("trans_vec"))

就像UDF一样,只是为传递给它的结构数组分配_1,_2 ..等。 稍后,您可以使用select()

重命名它们