2017-10-05 1 views
0

J'utilise Spark 2.1.1 (pyspark), en faisant un groupby suivi d'une agrégation approx_count_distinct sur un DataFrame avec environ 1,4 milliard de lignes. L'opération groupby génère environ 6 millions de groupes pour effectuer l'opération approx_count_distinct. Les nombres distincts attendus pour les groupes vont d'un chiffre à des millions.PySpark 2.1.1 groupby + approx_count_distinct donnant des comptes de 0

Voici l'extrait de code que j'utilise, avec la colonne 'item_id' contenant l'ID des éléments, et 'user_id' contenant l'ID des utilisateurs. Je veux compter les utilisateurs distincts associés à chaque élément.

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

Dans le dataframe résultant, que je reçois environ 16 000 articles avec un compte de 0:

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

Lorsque j'ai vérifié le compte distinct réelle pour certains de ces éléments, je suis entre les numéros 20 et 60. Est-ce un problème connu avec l'exactitude de l'algorithme de comptage approximatif HLL ou est-ce un bug?

Répondre

0

Bien que je ne sache pas exactement où se situe le problème réel, mais comme approx_count_distinct repose sur une approximation (https://stackoverflow.com/a/40889920/7045987), HLL pourrait bien être le problème.

Vous pouvez essayer ceci:

Il y a un paramètre « RSD » que vous pouvez passer approx_count_distinct qui détermine la marge d'erreur. Si rsd = 0, il vous donnera des résultats précis bien que le temps augmente considérablement et dans ce cas, countDistinct devient une meilleure option. Néanmoins, vous pouvez essayer de diminuer rsd pour dire 0,008 au prix de l'augmentation du temps. Cela peut aider à donner des résultats un peu plus précis.

+0

Merci pour la suggestion. J'ai essayé avec rsd = 0.008. Il a fallu environ 10 fois plus de temps pour fonctionner, mais je reçois le même nombre de 0 dans les résultats, donc cela n'a pas résolu le problème. – mmcc

+0

Ensuite, je suppose que les résultats resteront approximatifs dans cette mesure. approx_count_distinct ne donnera pas au point des résultats corrects dans presque tous les cas. Voir ce https://databricks.com/blog/2016/05/19/approximate-algorithms-in-apache-spark-hyperloglog-and-quantiles.html –