java - Java Spark 删除重复项/空值并保留顺序
问题描述
我有以下 Java Spark 数据集/数据框。
Col_1 Col_2 Col_3 ...
A 1 1
A 1 NULL
B 2 2
B 2 3
C 1 NULL
该数据集中有近 25 列,我必须删除在 Col_1 上重复的那些记录。如果第二条记录为 NULL,则必须删除 NULL(如 COl_1 = A 的情况),如果有多个有效值,如 Col_1 = B 的情况,则只有一个有效的 Col_2 = 2 和 Col_3 = 2 应该是每次都保留。如果只有一条带有 null 的记录,例如 Col_1 = C 的情况,则必须保留它
预期输出:
Col_1 Col_2 Col_3 ...
A 1 1
B 2 2
C 1 NULL
到目前为止我尝试了什么:
我尝试使用 group by 并使用 sort_array 和 array_remove 收集集合,但即使只有一行,它也会完全删除空值。
如何在 Java Spark 中实现预期的输出。
解决方案
这是使用 spark 数据帧的方法:
import org.apache.spark.sql.functions.{coalesce, col, lit, min, struct}
val rows = Seq(
("A",1,Some(1)),
("A",1, Option.empty[Int]),
("B",2,Some(2)),
("B",2,Some(3)),
("C",1,Option.empty[Int]))
.toDF("Col_1", "Col_2", "Col_3")
rows.show()
+-----+-----+-----+
|Col_1|Col_2|Col_3|
+-----+-----+-----+
| A| 1| 1|
| A| 1| null|
| B| 2| 2|
| B| 2| 3|
| C| 1| null|
+-----+-----+-----+
val deduped = rows.groupBy(col("Col_1"))
.agg(
min(
struct(
coalesce(col("Col_3"), lit(Int.MaxValue)).as("null_maxed"),
col("Col_2"),
col("Col_3"))).as("argmax"))
.select(col("Col_1"), col("argmax.Col_2"), col("argmax.Col_3"))
deduped.show()
+-----+-----+-----+
|Col_1|Col_2|Col_3|
+-----+-----+-----+
| B| 2| 2|
| C| 1| null|
| A| 1| 1|
+-----+-----+-----+
这里发生的事情是您正在分组Col_1
,然后获得复合结构的最小值,Col_3
但其中的Col_2
空值Col_3
已被最大整数值替换,因此它们不会影响排序。然后我们从结果行中选择原始Col_3
和。Col_2
我意识到这是在 scala 中,但 java 的语法应该非常相似。
推荐阅读
- android - 如何以编程方式重新启动android应用程序?
- go - Heroku go buildpack:找不到我创建的模块的导入路径
- mongodb - 如何使用 ID 数组查询 mongodb
- identityserver4 - 从 ProfileService 访问声明
- keras - 使用自定义损失函数在 keras 顺序模型上编译错误
- sql - 在 SNOWFLAKE 的另一个表中使用一列的值作为标识符
- vue.js - 在计算中返回一个 getter 创建一个循环
- azure - AD B2C 直接登录显示 {OIDC:LoginHint} 而不是电子邮件地址
- matlab - 简化涉及查找数组最大元素位置的 Matlab 代码
- html - Div 高度与仅在 IE11 中的属性上声明的不同