Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么Spark crossjoin只有在缓存时才能正常工作?_Java_Apache Spark_Apache Spark Dataset - Fatal编程技术网

Java 为什么Spark crossjoin只有在缓存时才能正常工作?

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()

我正在对我的Spark(2.3)应用程序进行故障排除,并意识到如果在交叉连接后不缓存数据集,我会得到错误的结果。我们知道交叉连接后是否需要缓存数据集吗

以下是我的数据集的外观:

+--------+------------+
|      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和as
是可交换的,关联优化器可以自由地按任意顺序重新排列术语。因此,查看
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();