pyspark根据列值删除重复的行

时间:2018-05-05 01:47:30

标签: python pyspark duplicates spark-dataframe rdd

我有 PySpark RDD 。我希望消除重复 仅当“第1列”和“第2列”匹配到下一行时。这就是数据的样子:

2,10482422,0.18
2,10482422,0.4
2,10482423,0.15
2,10482423,0.43
2,10482424,0.18
2,10482424,0.49
2,10482425,0.21
2,10482425,0.52
2,10482426,0.27
2,10482426,0.64
2,10482427,0.73

在上面的例子中,我只想通过删除其他重复行

为每一行增加第三列的最大值

预期输出为:

2,10482422,0.4
2,10482423,0.43
2,10482424,0.49
2,10482425,0.52
2,10482426,0.64
2,10482427,0.73

我尝试创建数据框并使用df.dropDuplicates(),但它没有给出预期的答案。如何根据两列保留此RDD中的最大值?

这是一个350 GB的RDD,任何最佳建议都会很棒。

2 个答案:

答案 0 :(得分:1)

您的答案不是100%明确是否要使用DataFrames,但如果您乐意从RDD创建DF,那么您还可以使用以下内容:

from pyspark.sql import functions as f
df.groupby('column1', 'column2')
  .agg(f.max(f.col('value').alias('maxval'))

答案 1 :(得分:0)

我认为reduceByKey会在这里提供帮助。

请记住,当使用reduceByKey或任何其他"按键"转换或操作您可以将键定义为元组。

rdd = sc.parallelize([(2,10482422,0.18),
(2,10482422,0.4),
(2,10482423,0.15),
(2,10482423,0.43),
(2,10482424,0.18),
(2,10482424,0.49),
(2,10482425,0.21),
(2,10482425,0.52),
(2,10482426,0.27),
(2,10482426,0.64),
(2,10482427,0.73)])

print rdd.map(lambda x: ((x[0], x[1]), x[2]))\
.reduceByKey(lambda x, y: x if x >= y else y)\
.collect()

结果:

[((2, 10482427), 0.73),
 ((2, 10482425), 0.52),
 ((2, 10482426), 0.64),
 ((2, 10482423), 0.43),
 ((2, 10482424), 0.49),
 ((2, 10482422), 0.4)]