Apache spark Apache Spark如何检测重复项?可以修改吗?
ApacheSpark如何检测重复行 我这样问的原因是我想有一种不同的行为: 在用于重复检测的列集合中,对于其中一些列(类型为Apache spark Apache Spark如何检测重复项?可以修改吗?,apache-spark,pyspark,apache-spark-sql,pyspark-sql,Apache Spark,Pyspark,Apache Spark Sql,Pyspark Sql,ApacheSpark如何检测重复行 我这样问的原因是我想有一种不同的行为: 在用于重复检测的列集合中,对于其中一些列(类型为double),我希望重复检测基于两个值之间的差值低于某个阈值(由我指定) 我想这可以通过使用crossJoin()和适当的where语句来实现,但是,我希望有一个更优雅的解决方案 谢谢 它使用HashArggregate: scala> df.distinct.explain == Physical Plan == *HashAggregate(keys=[x#1
double
),我希望重复检测基于两个值之间的差值低于某个阈值(由我指定)
我想这可以通过使用crossJoin()
和适当的where
语句来实现,但是,我希望有一个更优雅的解决方案
谢谢 它使用
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运算符提供的近似联接:
排序
和映射分区
实现
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
只要稍加努力,就可以使分区边界保持一致。感谢您提供的好的、有趣的提示。问题是:我试图得到一个精确的解决方案。对于近似解,我可以根据阈值进行乘法/除法/取整,然后使用它。顺便说一句:我确实有一个
groupID
列,可以用于Window.partitionBy('groupID')
。