我有一个DataFrame订单:
+-----------------+-----------+--------------+
| Id| Order | Gender|
+-----------------+-----------+--------------+
| 1622|[101330001]| Male|
| 1622| [147678]| Male|
| 3837| [1710544]| Male|
+-----------------+-----------+--------------+
我想在ID和性别上分组,然后汇总订单。 我使用org.apache.spark.sql.functions包和代码看起来像:
DataFrame group = orders.withColumn("orders", col("order"))
.groupBy(col("Id"), col("Gender"))
.agg(collect_list("products"));
但是,由于列Order是类型数组,因此我得到了这个异常,因为它需要一个基本类型:
User class threw exception: org.apache.spark.sql.AnalysisException: No handler for Hive udf class org.apache.hadoop.hive.ql.udf.generic.GenericUDAFCollectList because: Only primitive type arguments are accepted but array<string> was passed as parameter 1
我查看了包中有数组的排序函数但没有聚合函数。知道怎么做吗?感谢。
答案 0 :(得分:1)
在这种情况下,您可以定义自己的函数并将其注册为UDF
val userDefinedFunction = ???
val udfFunctionName = udf[U,T](userDefinedFunction)
然后代替然后在该函数内传递该列,以便将其转换为基本类型,然后在with Columns方法中传递它。
这样的事情:
val dataF:(Array[Int])=>Int=_.head
val dataUDF=udf[Int,Array[Int]](dataF)
DataFrame group = orders.withColumn("orders", dataUDF(col("order")))
.groupBy(col("Id"), col("Gender"))
.agg(collect_list("products"));
我希望它有效!