javardd减法结果就不同了

f3temu5u  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(382)

当我尝试使用javarddsubtract来比较2个Dataframe时,我遇到了一个奇怪的行为。
这就是我要做的:我试图通过将2个Dataframe(a,b)转换成javardd来比较它们是否相等,然后从b中减去a,从a中减去b。如果它们相等(包含相同的数据),那么两个结果都应该是空的javardd。
我没有得到空结果:

DataFrame A = someFunctionRespondWithDF(param);
DataFrame B = sqlContext.read().json("src/test/resources/expected/exp.json");
Assert.assertTrue(B.toJavaRDD().subtract(A.toJavaRDD()).isEmpty());
Assert.assertTrue(A.toJavaRDD().subtract(B.toJavaRDD()).isEmpty());

…Assert失败
如果我将数据写入磁盘并将其读回另一个Dataframe,就可以了。

A.write().json("target/result.json");
DataFrame AA = sqlContext.read().json("target/result.json");
Assert.assertTrue(B.toJavaRDD().subtract(AA.toJavaRDD()).isEmpty());
Assert.assertTrue(AA.toJavaRDD().subtract(B.toJavaRDD()).isEmpty());

…Assert正确
我还尝试通过调用dataframe上的count()、cache()或persist()函数来强制执行求值(基于这个答案),但没有成功。

DataFrame AAA = A.cache();
Assert.assertTrue(B.toJavaRDD().subtract(AAA.toJavaRDD()).isEmpty();
Assert.assertTrue(AAA.toJavaRDD().subtract(B.toJavaRDD()).isEmpty();

有没有人有过同样的经历?我错过了什么?
spark版本:1.6.1

jyztefdp

jyztefdp1#

好的,我可以回答我自己的问题:
它在Assert上失败的原因是,当我从json读取Dataframe时,类型不同。假设我在从json(!没有模式文件)这将是一个漫长的过程。解决方案->使用描述模式的格式,如avro。

相关问题