如何在Java中的Spark数据集中展平包装的数组

时间:2018-09-10 12:40:14

标签: java apache-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中实现以上输出。有人可以帮忙吗?谢谢。

2 个答案:

答案 0 :(得分:0)

这是使用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]        |
+-----+----------------------------------------------+-------------+    

希望这会有所帮助!

答案 1 :(得分:-1)

可以在分组之前使用功能“爆炸”:

df.withColumn("values", explode($"values")).groupBy("id").agg(collect_list($"values"))