运行 计数命令时引发不一致
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 值,这些值在重复调用管道时表现得不确定。
根据您的评论,您正在管道中使用 sampleBy
。 sampleBy
不保证您会得到精确的行数。它采用每个记录被包含的概率等于分数的样本,并且可以从 运行 运行.
变化
关于你在评论中的monotonically_increasing_id
问题,它只保证下一个id比上一个大,但不保证id是连续的(i,i+i,i+ 2,等等...)。
最后,您可以通过在其上调用 persist() 来持久化数据框。
关于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 值,这些值在重复调用管道时表现得不确定。
根据您的评论,您正在管道中使用 sampleBy
。 sampleBy
不保证您会得到精确的行数。它采用每个记录被包含的概率等于分数的样本,并且可以从 运行 运行.
关于你在评论中的monotonically_increasing_id
问题,它只保证下一个id比上一个大,但不保证id是连续的(i,i+i,i+ 2,等等...)。
最后,您可以通过在其上调用 persist() 来持久化数据框。