运行count命令时火花不一致

时间:2017-12-02 21:01:21

标签: count pyspark spark-dataframe

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

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

每次运行时,结果都会略有不同(141,830,然后是142,314)! 或者这个:

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

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

2 个答案:

答案 0 :(得分:1)

好的,我过去曾经遭受过主要。我有一个七或八个阶段的管道,规范化了几个表,添加了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值,这些值在管道重复调用时表现得非确定。

答案 1 :(得分:1)

根据您的评论,您在管道中使用sampleBysampleBy并不保证您能获得精确的行分数。它需要一个样本,每个记录的概率等于分数,并且可以在不同的运行之间变化。

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

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