我正在使用Spark 2.1.1(pyspark),在具有大约14亿行的数据帧上进行分组,然后进行approx_count_distinct聚合。分组依据操作会产生大约 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'))
在生成的数据帧中,我得到了大约 16,000 个计数为 0 的项目:
>>> distinct_counts_df.filter(distinct_counts_df.distinct_count == 0).count()
16032
当我检查其中一些项目的实际非重复计数时,我得到了 20 到 60 之间的数字。这是 HLL 近似计数算法准确性的已知问题还是错误?
虽然我不确定实际问题出在哪里,但由于approx_count_distinct依赖于近似(https://stackoverflow.com/a/40889920/7045987),HLL 很可能是问题所在。
你可以试试这个:
有一个参数"rsd",您可以在approx_count_distinct传递它来确定误差范围。如果 rsd = 0,它会给你准确的结果,尽管时间显着增加,在这种情况下,countDistinct 成为更好的选择。尽管如此,您可以尝试以增加时间为代价将 rsd 减小到 0.008。这可能有助于提供更准确的结果。