Spark Dataframe中的聚合数组类型

时间:2016-06-30 08:07:28

标签: apache-spark-sql

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

我查看了包中有数组的排序函数但没有聚合函数。知道怎么做吗?感谢。

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"));

我希望它有效!