Java 为什么Spark crossjoin只有在缓存时才能正常工作?
我正在对我的Spark(2.3)应用程序进行故障排除,并意识到如果在交叉连接后不缓存数据集,我会得到错误的结果。我们知道交叉连接后是否需要缓存数据集吗 以下是我的数据集的外观:Java 为什么Spark crossjoin只有在缓存时才能正常工作?,java,apache-spark,apache-spark-dataset,Java,Apache Spark,Apache Spark Dataset,我正在对我的Spark(2.3)应用程序进行故障排除,并意识到如果在交叉连接后不缓存数据集,我会得到错误的结果。我们知道交叉连接后是否需要缓存数据集吗 以下是我的数据集的外观: +--------+------------+ | id| nameGroupId| +--------+------------+ | joe san| 6302870528| |john san|936302870528| +--------+------------+ 当我使用未注释的.cache()
+--------+------------+
| id| nameGroupId|
+--------+------------+
| joe san| 6302870528|
|john san|936302870528|
+--------+------------+
当我使用未注释的.cache()语句执行下面的代码时,callUDF(“LeftNameTokenComplete”)UDF将使用以下参数调用,这是我所期望的:
df1.id=“joe san”和df2.id=“john san”
但是,当我使用.cache()语句执行相同的代码块时,callUDF(“LeftNameTokenComplete”)UDF将使用以下参数调用。这太疯狂了,因为UDF之前的filter()会阻止这种情况发生
df1.id=“joe san”和df2.id=“joe san”
Dataset connectedDf=sparkSession.read().json(this.workspaceDir+“connected df”);
连接的DF.as(“df1”)
.交叉连接(连接的DF.as(“df2”))
//.cache()//仅当缓存时才更正结果!
.filter(“df1.id
没有理由按照您用来在代码中定义谓词的特定顺序应用谓词,因为从逻辑角度看,它只定义了连接词,如“df1.id和
是可交换的,关联优化器可以自由地按任意顺序重新排列术语。因此,查看df1.id=“joe san”
和`df2.id=“joe san”并不罕见。不寻常的事情是看到这两个术语的最终结果不同。如果是这样,请提供一个和……执行计划().此外,如果这确实是一个正确性问题,您应该打开。
Dataset<Row> connectedDf = sparkSession.read().json(this.workspaceDir + "connected-df");
connectedDf.as("df1")
.crossJoin(connectedDf.as("df2"))
//.cache() //correct results only when cached!
.filter( "df1.id < df2.id" )
.withColumn("leftComp", functions.callUDF("leftNameTokenComplement", col("df1.id"), col("df2.id") ))
.filter( functions.size(col("leftComp")).equalTo(1) )
.withColumn("src1", functions.callUDF("firstInArray", col("leftComp")) )
.withColumn("matchedPhonic", functions.callUDF("isNameTokenPhonicMatch", col("src1")) )
.filter( col("matchedPhonic").equalTo(true))
.show();