为什么Spark交叉联接仅在缓存时才起作用?

时间:2019-05-24 14:45:36

标签: java apache-spark apache-spark-dataset

我正在对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();

0 个答案:

没有答案