我正在对Spark(2.3)应用程序进行故障排除,并且意识到如果在crossJoin之后没有缓存数据集,则会得到错误的结果。我们知道在crossJoin之后是否需要缓存数据集吗?
这是我的数据集的样子:
+--------+------------+
| id| nameGroupId|
+--------+------------+
| joe san| 6302870528|
|john san|936302870528|
+--------+------------+
当我使用.cache()语句 uncommented 执行以下代码时,会使用以下参数调用 callUDF(“ leftNameTokenComplement”) UDF,这是什么?我希望:
df1.id =“ joe san”&df2.id =“ john san”
但是,当我使用.cache()语句注释执行相同的代码块时,会使用以下参数调用 callUDF(“ leftNameTokenComplement”) UDF。这很疯狂,因为在UDF之前 filter()会阻止这种情况的发生。
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();