2015-12-10 40 views
1

我得到類似的問題不工作:星火GROUPBY AGG預期

(df 
    .groupBy("email") 
    .agg(last("user_id") as "user_id") 
    .select("user_id").count, 
df 
    .groupBy("email") 
    .agg(last("user_id") as "user_id") 
    .select("user_id") 
    .distinct 
    .count) 

時,它提供一臺計算機上運行:(15123144,15123144)

當集羣中運行它給:(15123144, 24)

第一個是預期的,看起來正確,但第二個是可怕的錯誤。還有一點觀察 - 即使我改變總數超過/小於15123144的數據,我在羣集上得到distinct = 24。 即使我交換user_id和電子郵件,它也會給出相同的不同計數。

我比較困惑的看到:https://spark.apache.org/docs/1.5.2/api/scala/index.html#org.apache.spark.sql.DataFrame

AGG的醫生說:對整個數據幀不聚集羣。 「沒有組」?那是什麼意思?

任何線索?或Jira票?或者現在可以解決的問題?

回答

1

讓我們從「無組」部分開始。由於它是在文檔中描述:

df.agg(...)是df.groupBy()的簡寫AGG(...)

如果仍然不明確。將它轉換爲SQL:

SELECT SOME_AGGREGATE_FUNCTION(some_column) FROM table 

關於你提到的第二個問題是很難給你一個很好的答案,但無數據,但一般來說這兩個查詢是不等價的訪問。第一個簡單地計算不同的email值,第二個計算每個電子郵件的最後user_id的唯一值。此外last沒有明確的排序是沒有意義的。

+0

感謝zero323,正如我所說的:當在一臺計算機上運行時,它會給出:(15123144,15123144),並且通過數據不應該爲不同的user_id重複發送電子郵件,反之亦然。我可以對數據說多少。對不起,我無法在這裏分享樣本數據。 –

+0

沒有顯式的排序(就像在窗口函數中一樣)「last」沒有意義,所以根據配置你可以得到不同的結果。我將開始檢查在集羣中的'df.groupBy(...).agg(...)。select(...).distinct'後面得到的內容。它應該給你一些想法是怎麼回事(是否有任何空值/空字符串)。沒有一個可重複的例子(這裏沒有人想要你的真實數據),這個問題與任何開放的JIRA一樣,都只是一種好奇心。 – zero323

+0

在日誌中,我看到:15/12/11 17:43:20 INFO scheduler.TaskSetManager:在slave4.example.com(24/24)上的階段14.0(TID 795)中完成的任務23.0在671毫秒內是否與24個不同的值,或者我們可以從日誌中的這條線做出任何事情? –