web-dev-qa-db-fra.com

Comment compter un identifiant unique après groupBy dans pyspark

J'utilise le code suivant pour regrouper les étudiants chaque année. Le but est de connaître le nombre total d'étudiants pour chaque année.

from pyspark.sql.functions import col
import pyspark.sql.functions as fn
gr = Df2.groupby(['Year'])
df_grouped = 
gr.agg(fn.count(col('Student_ID')).alias('total_student_by_year'))

Le résultat est :

[étudiants par année] [1]

Le problème que j'ai découvert que tant d'identifiants se répètent Donc, le résultat est faux et énorme.

Je veux regrouper les étudiants par année, compter le nombre total d'étudiants par année et éviter la répétition des pièces d'identité.

J'espère que la question est claire. Je suis nouveau membre Merci

18
Lizou

Utilisez la fonction countDistinct

from pyspark.sql.functions import countDistinct
x = [("2001","id1"),("2002","id1"),("2002","id1"),("2001","id1"),("2001","id2"),("2001","id2"),("2002","id2")]
y = spark.createDataFrame(x,["year","id"])

gr = y.groupBy("year").agg(countDistinct("id"))
gr.show()

sortie

+----+------------------+
|year|count(DISTINCT id)|
+----+------------------+
|2002|                 2|
|2001|                 2|
+----+------------------+
40
ashwinids

Vous pouvez aussi faire:

gr.groupBy("year", "id").count().groupBy("year").count()

Cette requête renvoie les étudiants uniques par an.