运行 计数命令时引发不一致

spark inconsistency when running count command

关于Spark计算不一致的问题。这存在吗?例如,我 运行ning 完全相同的命令两次,例如:

imp_sample.where(col("location").isNotNull()).count()

而且我每次 运行 得到的结果都略有不同(141,830,然后是 142,314)! 或者这个:

imp_sample.where(col("location").isNull()).count()

得到 2,587,013,然后是 2,586,943。这怎么可能? 谢谢!

好吧,我过去曾主要受过这个。我有一个七或八个阶段的管道,它规范化了几个表,添加了 id,加入它们并将它们分组。同一管道的连续运行给出了不同的结果,尽管不是我能理解的任何连贯模式。

长话短说,我将此功能追溯到我对函数 monotonically_increasing_id 的使用,应该由 this JIRA ticket 解决,但在 Spark 2.2 中仍然很明显。

我不知道你的管道到底做了什么,但请理解我的解决方法是强制 SPARK 在调用 monotonically_increasing_id 后保留结果。开始这样做后,我再也没有看到这个问题。

如果明智的坚持解决了这个问题,请告诉我。

要持久化 RDD 或 DataFrame,请调用 df.cache(默认为内存持久化)或 df.persist([某些存储级别]),例如

df.persist(StorageLevel.DISK_ONLY)

同样,它可能对你没有帮助,但在我的例子中,它迫使 Spark 清除并写入 id 值,这些值在重复调用管道时表现得不确定。

根据您的评论,您正在管道中使用 sampleBysampleBy不保证您会得到精确的行数。它采用每个记录被包含的概率等于分数的样本,并且可以从 运行 运行.

变化

关于你在评论中的monotonically_increasing_id问题,它只保证下一个id比上一个大,但不保证id是连续的(i,i+i,i+ 2,等等...)。

最后,您可以通过在其上调用 persist() 来持久化数据框。