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

How to drop duplicates considering only subset of columns?

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

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

但我一直在 aggrgn_filter_group_id 列中得到重复值。你能提出一些解决方案吗?

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")

价格是用 distinctjoin 执行额外的 select,但应该会给你预期的结果。

Spark >= 2.0

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

引用 documentation:

distinct(): Dataset[T] Returns a new Dataset that contains only the unique rows from this Dataset. This is an alias for dropDuplicates.

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

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

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

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