PySpark 2.1.1 groupby + approx_count_distinct给出计数0

时间:2017-10-05 14:47:15

标签: apache-spark spark-dataframe

我正在使用Spark 2.1.1(pyspark),在一个DataFrame上进行groupby后跟一个about_count_distinct聚合,大约有14亿行。 groupby操作导致大约600万个组执行approx_count_distinct操作。这些组的预期不同计数范围从一位数到数百万。

以下是我正在使用的代码段,其中“item_id”列包含项目ID,“user_id”包含用户ID。我想计算与每个项目相关联的不同用户。

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

在生成的DataFrame中,我得到大约16,000项,计数为0:

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

当我检查其中一些项目的实际非重复计数时,我得到了20到60之间的数字。这是HLL近似计数算法准确性的已知问题还是这个错误?

1 个答案:

答案 0 :(得分:0)

虽然我不确定实际问题在哪里,但由于approx_count_distinct依赖于近似值(https://stackoverflow.com/a/40889920/7045987),因此HLL可能就是问题所在。

你可以试试这个:

有一个参数' rsd'您可以通过approx_count_distinct传递,它确定误差范围。如果rsd = 0,虽然时间显着增加,但它会给你准确的结果,在这种情况下,countDistinct会成为更好的选择。不过,您可以尝试以增加时间为代价来减少rsd以表示0.008。这可能有助于提供更准确的结果。