Apache Spark如何检测重复的行?
我问的原因是我想要有一些不同的行为:
在用于重复检测的列集中,对于其中一些列(类型为double
),我希望重复检测是基于两个值之间的差异低于某个阈值(由我指定。)
我想之后可以使用crossJoin()
和适当的where
语句来实现这一点,但是,我希望有一个更优雅的解决方案?
谢谢!
答案 0 :(得分:1)
它使用HashArggregate
:
scala> df.distinct.explain
== Physical Plan ==
*HashAggregate(keys=[x#12], functions=[])
+- Exchange hashpartitioning(x#12, 200)
+- *HashAggregate(keys=[x#12], functions=[])
+- LocalTableScan [x#12]
我希望有一个更优雅的解决方案?
您可以尝试LSH运营商提供的近似连接:
但不太可能使用单一功能。
您可以使用与窗口函数类似的类似会话的方法,但这只有在您可以将数据划分为分区时才有用。如果您对近似值没问题,可以使用固定大小范围,然后应用我在Spark - Window with recursion? - Conditionally propagating values across rows中描述的方法
使用sort
后跟mapPartitions
可以实现另一种近似。
df.sortBy("someColumn").rdd.mapPartitions(drop_duplicates).toDF()
其中dropDuplicates
的实现类似于:
def drop_duplicates(xs):
prev = None
for x in xs:
if prev is None or abs(x - prev) > threshold:
yield x
prev = x
通过一些努力,您也可以在分区边界上保持一致。