Spark Dataframe中的聚合数组类型



我有一个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"));

相关内容

  • 没有找到相关文章

最新更新