web-dev-qa-db-ja.com

pysparkでgroupByの後に一意のIDをカウントする方法

次のコードを使用して、年間の学生を集計しています。目的は、各年の学生の総数を知ることです。

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'))

結果は次のとおりです。

[年ごとの学生] [1]

私が発見した問題は、非常に多くのIDが繰り返されるため、結果は間違っていて巨大です。

年ごとに生徒を集計し、年ごとに生徒の総数を数え、IDの繰り返しを避けたいと思います。

質問が明確であることを願っています。私は新しいメンバーですありがとう

18
Lizou

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()

出力

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

次のこともできます。

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

このクエリは、年間のユニークな学生を返します。