java - 如何在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 中实现上述输出。有人可以帮忙吗?谢谢。
解决方案
这是使用 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] |
+-----+----------------------------------------------+-------------+
希望这可以帮助!
推荐阅读
- autodesk-forge - 如何在 Forge Viewer 中覆盖 ModelStructurePanel 以首先显示可用模型的列表(但不加载它们,直到我单击其中任何一个)
- c# - 'HttpResponseMessage' 类型是在未引用的程序集中定义的
- unity3d - 无法输入 HTML 表单文本/密码/数字输入字段(使用 Unity WebGL 构建的网站)
- asp.net - BC30002 类型 'abcdefg' 未定义 构建 VS 2017 时出错
- c# - 无法从 GCP Cloud Run 上运行的 .net 应用程序连接到 postgres 实例
- autohotkey - 如何确定选择文件对话框何时处于活动状态?
- python - 从令牌(FunctionDef)构建 AST?
- php - 如何列出目录中的所有图像并将它们包含在 php 中
- python - 如何使用 selenium 定期从网站获取记录?
- javascript - Mocha.js:所有测试完成后如何运行一些代码?