apache-spark - Spark基于逻辑拆分数据帧
问题描述
我有一个用例,我需要使用列(它是 GUID 列)对数据框进行重复数据删除。但是,我需要将它们存储在单独的位置,而不是转储重复项。因此,例如,如果我们有以下数据,带有 schema (name, GUID) :
(a, 1), (b, 2), (a, 2), (a, 3), (c, 1), (c, 4)
。我想拆分数据集,以便我拥有:
(a, 1), (b, 2), (a, 3), (c, 4)
第一部分和(a, 2), (c, 1)
第二部分。如果我使用dropDuplicates(col("GUID")),第二部分会丢失。什么是一种有效的方法来做到这一点?
解决方案
您可以分配行号,并根据行号是否等于 1 将数据框拆分为两部分。
from pyspark.sql import functions as F, Window
df2 = df.withColumn(
'rn',
F.row_number().over(Window.partitionBy('GUID').orderBy(F.monotonically_increasing_id()))
)
df2.show()
+----+----+---+
|name|GUID| rn|
+----+----+---+
| a| 1| 1|
| c| 1| 2|
| a| 3| 1|
| b| 2| 1|
| a| 2| 2|
| c| 4| 1|
+----+----+---+
df2_part1 = df2.filter('rn = 1').drop('rn')
df2_part2 = df2.filter('rn != 1').drop('rn')
df2_part1.show()
+----+----+
|name|GUID|
+----+----+
| a| 1|
| a| 3|
| b| 2|
| c| 4|
+----+----+
df2_part2.show()
+----+----+
|name|GUID|
+----+----+
| c| 1|
| a| 2|
+----+----+