【问题标题】:JavaRDD subtract result differs if data read from disk or it's in memory如果数据从磁盘读取或在内存中,JavaRDD 减法结果会有所不同
【发布时间】:2016-11-11 08:52:20
【问题描述】:

当我尝试使用 JavaRDD 减法比较 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());

...断言失败

如果我将数据写入磁盘并将其读回另一个 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());

...断言为真

我还尝试通过在 DataFrame (based on this answer) 上调用 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

【问题讨论】:

  • 你能举个例子吗?
  • 添加示例代码

标签: apache-spark spark-dataframe


【解决方案1】:

好的,我可以回答我自己的问题:

断言失败的原因是当我从 json 读取 DataFrame 时,类型不同。假设我的原始 DataFrame 中有一个 Integer,在从 json(!没有模式文件)读回它之后,它将是一个 Long。 解决方案-> 使用描述架构的格式,例如 avro。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-29
    • 1970-01-01
    • 2015-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-12
    • 1970-01-01
    相关资源
    最近更新 更多