【问题标题】:How to drop duplicates considering only subset of columns?如何仅考虑列的子集删除重复项?
【发布时间】:2018-07-09 15:04:56
【问题描述】:

我使用 Spark 1.6 并正在对两个数据帧进行内部连接,如下所示:

val filtergroup = metric
  .join(filtercndtns, Seq("aggrgn_filter_group_id"), inner)
  .distinct()

但我在aggrgn_filter_group_id 列中不断收到重复值。您能提出一些解决方案吗?

【问题讨论】:

    标签: scala apache-spark-sql apache-spark-1.6


    【解决方案1】:

    火花

    考虑 distinct 对包含要删除重复项的列的数据集,然后在列上进行内部连接。

    // don't use distinct yet
    val filtergroup = metric
      .join(filtercndtns, Seq("aggrgn_filter_group_id"), "inner")
    
    // take unique aggrgn_filter_group_ids
    val uniqueFilterGroups = filtergroup
      .select("aggrgn_filter_group_id")
      .distinct
    
    // Inner join to remove duplicates from the source dataset
    filtergroup.join(uniqueFilterGroups, Seq("aggrgn_filter_group_id"), "inner")
    

    代价是执行一个额外的selectdistinctjoin,但应该会给你预期的结果。

    火花 >= 2.0

    以下解决方案仅适用于支持 dropDuplicates 运算符的 Spark 2.0+,并允许仅考虑列的子集删除重复项。

    引用documentation

    distinct():数据集[T] 返回一个仅包含此数据集中唯一行的新数据集。这是dropDuplicates 的别名。

    distinctdropDuplicates 只需删除比较每一列的重复行。

    如果您对特定列感兴趣,您应该使用dropDuplicates 之一,例如

    val filtergroup = metric
      .join(filtercndtns, Seq("aggrgn_filter_group_id"), "inner")
      .dropDuplicates("aggrgn_filter_group_id")
    

    当您指定一列或一组列时,dropDuplicates 返回一个删除重复行的新数据集,仅考虑列的子集。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-29
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 2021-06-15
    • 2012-02-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多