Apache spark spark udf返回相同元素为结构数组抛出错误

Apache spark spark udf返回相同元素为结构数组抛出错误,apache-spark,apache-spark-sql,user-defined-functions,apache-spark-2.1,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() de

我的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.;;
线程“main”org.apache.spark.sql.AnalysisException中的异常:由于数据类型不匹配,无法解析“UDF(trans_-vec)”:参数1需要数组类型,但是,“trans_-vec”是数组类型。;;

如何修复此问题?

如果以下代码从

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

看起来UDF只分配了_1,_2。。对于传递给它的结构数组,依此类推。
稍后,您可以使用select()重命名它们。

可能是某个人发布答案的重复项,然后我才能处理它。。它被删除了。我发布了一个,但我觉得保留它真的没有意义,因为除了天真的身份,你将无法使用它。再次重申-此
udf\u gen\u rows('trans\u vec).cast(“数组”)
将通过,但没有实际应用OK。。实际上,我想添加一个序列号(String,String,Int)并在UDF中返回它,但它抛出了一个错误。。因此,为了调试它,我只是尝试返回输入。在2.1中,您需要使用
(Seq[Row])=>Seq[(String,String,Int)]
作为链接问题中的
udf
。由于2.4,有更好的选项可用。至于铸造-它将只适用于身份,因为实际类型不匹配。这就是为什么我认为答案不值得保留的原因。
val df2 = df.groupBy("id").agg(collect_list(struct('dt.as("_1"),'amt.as("_2")).as("trans_vec"))