如何仅考虑列子集删除重复项?

时间:2018-07-06 10:54:40

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

我使用Spark 1.6,并且在两个数据帧上进行内部联接,如下所示:

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

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

1 个答案:

答案 0 :(得分:0)

Spark <2.0

考虑在具有列的数据集上使用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")

价格是用selectdistinct执行额外的join,但应该给您预期的结果。

火花> = 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返回一个新的数据集,其中删除了重复的行,仅考虑列的子集。