pyspark 根据列值删除重复行
pyspark remove duplicate rows based on column value
我有一个 PySpark RDD。我想 消除重复项 仅当 "column 1" 和 "column 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,任何优化建议都会很棒。
我认为 reduceByKey 会有所帮助。
请记住,在使用 reduceByKey 或任何其他 "By Key" 转换或操作时,您可以将键定义为元组。
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)]
您的回答不是 100% 清楚您是否要使用 DataFrame,但如果您乐于从 RDD 创建 DF,那么您也可以使用以下内容:
from pyspark.sql import functions as f
df.groupby('column1', 'column2')
.agg(f.max(f.col('value').alias('maxval'))
我有一个 PySpark RDD。我想 消除重复项 仅当 "column 1" 和 "column 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,任何优化建议都会很棒。
我认为 reduceByKey 会有所帮助。
请记住,在使用 reduceByKey 或任何其他 "By Key" 转换或操作时,您可以将键定义为元组。
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)]
您的回答不是 100% 清楚您是否要使用 DataFrame,但如果您乐于从 RDD 创建 DF,那么您也可以使用以下内容:
from pyspark.sql import functions as f
df.groupby('column1', 'column2')
.agg(f.max(f.col('value').alias('maxval'))