我有一个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
我已经在包中查看了,有数组的排序函数,但没有聚合函数。知道怎么做吗?谢谢。
在这种情况下,您可以定义自己的函数并将其注册为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"));