【问题标题】:pyspark remove duplicate rows based on column valuepyspark 根据列值删除重复行
【发布时间】:2018-05-05 01:47:29
【问题描述】:

我有一个 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,任何最佳建议都会很棒。

【问题讨论】:

    标签: python pyspark duplicates spark-dataframe rdd


    【解决方案1】:

    您的答案不是 100% 清楚您是否要使用 DataFrames,但如果您乐于从您的 RDD 创建一个 DF,那么您也可以使用以下内容:

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

    【讨论】:

      【解决方案2】:

      我认为 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)]
      

      【讨论】:

        猜你喜欢
        • 2019-05-29
        • 2021-06-24
        • 1970-01-01
        • 2011-04-21
        • 1970-01-01
        • 2017-08-08
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        相关资源
        最近更新 更多