2017-12-02 229 views
2

有關Spark計算不一致的問題。這是否存在?例如,我運行完全一樣的命令兩​​次,例如:運行計數命令時出現點火不一致

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

而且每次運行它的時候我收到稍有不同的結果(141830,然後142314)! 或者這樣:

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

並獲得2587013,然後2586943。這怎麼可能? 謝謝!

+0

這不應該發生,你如何填充'imp_sample'? – Jaco

+0

@Jaco - 如何填充它很重要?我的意思是 - 爲什麼它很重要?我有一個很長的代碼,一次又一次地修改它。但一旦它被填充,相同的命令會產生不同的結果。同樣,當我做最後的imp_sample計數時,將該文件作爲parquet文件寫出,然後讀入 - 我也得到稍微不同的行數! – user3245256

+0

@Jaco我一直在想你的問題,並想感謝你。也許你可以提供它作爲答案,以便我可以upvote它?在我進行計數之前,我會進行採樣:sampled_impressions = impressions3.sampleBy(「click_status」,fractions = {0:0.037,1:1},seed = 0) - 由於四捨五入,我認爲有一些誤差7000萬行。所以,每次我在這條線後執行計數,結果都會有所不同。正確? – user3245256

回答

1

根據您的評論,您正在使用sampleBy在您的管道。 sampleBy不能保證你會得到行的確切分數。每個記錄包含的分數等於分數,並且可能因樣本的概率而異。

關於在評論你的monotonically_increasing_id問題,它只能保證下一個ID比前一個更大的,但是,它並不能保證ID是連續的(I,I + I,I + 2等。 )。

最後,你可以通過persist()來堅持一個數據框。

0

好的,我從此遭受重大從此。我有一個七或八階段的管道,將幾個表格歸一化,添加了id,加入並分組。同一管道的連續運行給出了不同的結果,儘管不是我能理解的任何連貫模式。長話短說,我將這個功能追溯到我使用函數monotonically_increasing_id,假設解決方案爲this JIRA ticket,但在Spark 2.2中仍然很明顯。

我不確切知道你的管道是幹什麼的,但請理解我的修復是強制SPARK在調用monotonically_increasing_id後堅持結果。我開始這樣做後再也沒有看到這個問題。

讓我知道如果明智的堅持解決這個問題。

要保留的RDD或數據幀,呼叫或者df.cache(默認爲在內存中的持久性)或df.persist([一些存儲水平]),例如

df.persist(StorageLevel.DISK_ONLY) 

再次,這可以不是幫助你,但在我的情況下,它強制Spark刷新並寫入id值,這些值在流水線的重複調用時表現得非確定性。

+0

謝謝!在迴應上面的Jaco的評論中,我假設我得到的行數不同是由於在我抽樣之前的事實。我確實修復了種子,但是也許四捨五入會導致每次結果稍有不同。這就是說,我也嘗試過使用單調的Increasing_id,當它產生糟糕的結果(當我將它應用到2個同樣高度的DF時,這個id不是連續的),我停了下來。但是,你如何強制Spark堅持結果?這是什麼代碼?謝謝! – user3245256

+0

增加了一個例子 - 非常好奇,如果這種排序你的問題! – Chondrops

相關問題