首页 > 解决方案 > 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")),第二部分会丢失。什么是一种有效的方法来做到这一点?

标签: apache-sparkpysparkapache-spark-sql

解决方案


您可以分配行号,并根据行号是否等于 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|
+----+----+

推荐阅读