我使用Spark 1.6,并且在两个数据帧上进行内部联接,如下所示:
val filtergroup = metric
.join(filtercndtns, Seq("aggrgn_filter_group_id"), inner)
.distinct()
但是我在aggrgn_filter_group_id
列中不断得到重复的值。您能提出一些解决方案吗?
答案 0 :(得分: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")
价格是用select
和distinct
执行额外的join
,但应该给您预期的结果。
以下解决方案仅适用于支持dropDuplicates
运算符的 Spark 2.0 + ,并允许仅考虑部分列来删除重复项。
distinct():数据集[T] 返回一个仅包含该数据集中唯一行的新数据集。这是
dropDuplicates
的别名。
distinct
或dropDuplicates
只需删除比较每一列的重复行。
如果您对特定列感兴趣,则应使用dropDuplicates
之一,例如
val filtergroup = metric
.join(filtercndtns, Seq("aggrgn_filter_group_id"), "inner")
.dropDuplicates("aggrgn_filter_group_id")
指定一列或一组列时,dropDuplicates
返回一个新的数据集,其中删除了重复的行,仅考虑列的子集。