2017-10-05 106 views
0

我使用Spark 2.1.1(pyspark),在一個DataBrame上執行一個groupby,然後進行一次approx_count_distinct聚合,大約有14億行。 groupby操作會導致約600萬個組對其執行approx_count_distinct操作。預計不同組別的計數範圍從一位數到幾百萬。PySpark 2.1.1 groupby + approximate_count_distinct給出0的計數

以下是我正在使用的代碼段,其中包含項目ID的'item_id'列和包含用戶ID的'user_id'。我想統計與每個項目關聯的不同用戶。

>>> distinct_counts_df = data_df.groupby(['item_id']).agg(approx_count_distinct(data_df.user_id).alias('distinct_count')) 

在產生的數據幀,我越來越爲0的數約16000項:

>>> distinct_counts_df.filter(distinct_counts_df.distinct_count == 0).count() 
16032 

當我檢查的實際重複計數幾個這些項目中,我得到了之間的數字20和60.這是HLL近似計數算法的準確度的一個已知問題還是這是一個錯誤?

回答

0

雖然我不確定實際問題出在哪裏,但由於approx_count_distinct依賴於近似(https://stackoverflow.com/a/40889920/7045987),HLL可能是問題所在。

你可以試試這個:

有一個參數「RSD」你可以在approx_count_distinct這就決定了誤差傳遞。如果rsd = 0,它會給你準確的結果,儘管時間顯着增加,在這種情況下,countDistinct會成爲更好的選擇。儘管如此,你可以嘗試減少rsd以0.008來增加時間。這可能有助於提供更準確的結果。

+0

感謝您的建議。我試着用rsd = 0.008。花了大約10倍的時間運行,但我得到的結果中0的數量相同,所以它沒有解決問題。 – mmcc

+0

然後我猜想結果仍然接近這個程度。幾乎大部分情況下,approx_count_distinct都不會給出正確的結果。看到這個https://databricks.com/blog/2016/05/19/approximate-algorithms-in-apache-spark-hyperloglog-and-quantiles.html –