关于火花计算不一致的问题。是否存在?例如,我两次运行了完全相同的命令,例如:
imp_sample.where(col("location").isNotNull()).count()
每次运行时,我的结果略有不同(141,830,然后是142,314)!或以下:
imp_sample.where(col("location").isNull()).count()
获得2,587,013,然后获得2,586,943。怎么可能?谢谢!
根据您的评论,您正在管道中使用sampleBy
。sampleBy
不能保证您会获得行的确切分数。它需要一个示例,每个记录都等于分数,并且可能因运行而异。
关于您的 monotonically_increasing_id
问题,它只能保证下一个ID大于上一个ID,但是,它不能保证ID是连续的(i,i i,i 2等...)。
最后,您可以通过在其上持续persist()来坚持一个数据框。
好吧,过去我曾经遭受过。我有一个七个或八个阶段的管道,将几张桌子归一化,添加了ID,加入了它们并将它们分组。同一管道的连续运行给出了不同的结果,尽管我无法理解任何连贯的模式。
长话短说,我将此功能追溯到我对函数单调的函数的用法,该功能被认为是由这张JIRA票解决的,但仍然在Spark 2.2中很明显。
我不知道您的管道在做什么,但是请理解,我的修复是在拨打单调的_increasing_id后强迫火花以坚持结果。我开始这样做后我再也没有看到这个问题。
让我知道明智的坚持解决这个问题。
要坚持RDD或DataFrame,请调用DF.Cache(默认为内存持久性)或DF.Persist([一些存储级别]),例如
df.persist(StorageLevel.DISK_ONLY)
再次,它可能无济于事,但是在我的情况下,它被迫冲洗并写出无确定性的iD值,而这些值反复给出了管道的重复调用。