首页 > 解决方案 > 如何在java中展平spark数据集中的包装数组

问题描述

使用 Spark 2.2 Java 1.8

我需要收集数组列的集合。但它给了我 WrappedArray。请看下文。

Dataset<Row> df2 = df.groupBy("id").agg(collect_list("values"))
df2.show(truncate=False)
# +-----+----------------------------------------------+ 
# |id|                         collect_list(values) | 
# +-----+----------------------------------------------+ 
# |1    |[WrappedArray(1, 2, 3), WrappedArray(4, 5, 6)]| 
# |2    |[WrappedArray(2), WrappedArray(3)]            | 
# +-----+----------------------------------------------+

Expected output : = 

# +-----+------------------+
# |store|           values |
# +-----+------------------+
# |1    |[1, 2, 3, 4, 5, 6]|
# |2    |[2, 3]            |
# +-----+------------------+

我们如何在 spark java 中实现上述输出。有人可以帮忙吗?谢谢。

标签: javaapache-spark

解决方案


这是使用 UDF(不是 java Guy)的 scala 等价物:

//df.show(false)

+-----+----------------------------------------------+
|store|values                                        |
+-----+----------------------------------------------+
|1    |[WrappedArray(1, 2, 3), WrappedArray(4, 5, 6)]|
|2    |[WrappedArray(2), WrappedArray(3)]            |
+-----+----------------------------------------------+

import org.apache.spark.sql._
import org.apache.spark.sql.functions._

val flattenWrappedArray = udf((value:  Seq[Seq[Int]]) => {value.flatten})
df.withColumn("values_new",flattenWrappedArray($"values")).show(false)

输出:

+-----+----------------------------------------------+-------------+
|store|values                                        |values_new   |
+-----+----------------------------------------------+-------------+
|1    |[WrappedArray(1, 2, 3), WrappedArray(4, 5, 6)]|[1,2,3,4,5,6]|
|2    |[WrappedArray(2), WrappedArray(3)]            |[2,3]        |
+-----+----------------------------------------------+-------------+    

希望这可以帮助!


推荐阅读