Apache spark 为什么向量的Spark数据帧上的MergeSort连接后的不同计数会给出不确定的结果
使用包含ml向量的列进行spark内部SortMerge联接时,在较大的数据集上似乎会给出不确定和不准确的结果 我使用了Spark v2.4.3的BucketRandomLSH投影方法,发现它对大数据集给出了不同数量的结果 此问题仅在执行SortMerge联接时出现;广播联接每次都给出相同的结果 我追踪到了LSH哈希键上的连接问题。下面是一个可复制的示例Apache spark 为什么向量的Spark数据帧上的MergeSort连接后的不同计数会给出不确定的结果,apache-spark,Apache Spark,使用包含ml向量的列进行spark内部SortMerge联接时,在较大的数据集上似乎会给出不确定和不准确的结果 我使用了Spark v2.4.3的BucketRandomLSH投影方法,发现它对大数据集给出了不同数量的结果 此问题仅在执行SortMerge联接时出现;广播联接每次都给出相同的结果 我追踪到了LSH哈希键上的连接问题。下面是一个可复制的示例 import org.apache.spark.sql.functions_ 导入org.apache.spark.ml.linalg.Vec
import org.apache.spark.sql.functions_
导入org.apache.spark.ml.linalg.Vectors
导入scala.util.Random
spark.conf.set(“spark.sql.autoBroadcastJoinThreshold”,-1)
//创建包含长度为1的ml向量数组(长度为2)的大型数据帧。
val df=顺序填充(30000)(
(java.util.UUID.randomUUID.toString,
序号(
向量。稠密(随机。下一个(10)。双重),
向量。稠密(随机。下一个(10)。双)
)
)托夫先生
//确保它是缓存
df.cache.count()
//位置分解向量列
val dfexplode=df.select(列(“*”),posexplode(列(“_2”))
//现在在分解的“col”和“pos”字段上进行自联接
dfExploded.join(dfExploded,Seq(“pos”,“col”)).drop(“pos”,“col”).distinct.count
每次都有不同的结果
scala>dfExploded.join(dfExploded,Seq("pos","col")).drop("pos","col").distinct.count
res139: Long = 139663581
scala>dfExploded.join(dfExploded,Seq("pos","col")).drop("pos","col").distinct.count
res140: Long = 156349630
有趣的是,如果您使用Scalas
Seq[Double]
而不是SparksVector
,那么它是确定性的。我认为问题可能是你的连接条件,在这里你比较两个稠密向量项(它们是浮点),你是对的!谢谢我想问题是为什么不能成功地比较两个向量?LSH算法被这一点打破(参见此)