使用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中实现以上输出。有人可以帮忙吗?谢谢。
答案 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"))