web-dev-qa-db-fra.com

Obtenez les éléments distincts de chaque groupe par un autre champ sur un Spark 1.6 Dataframe

J'essaye de grouper par date dans un Spark dataframe et pour chaque groupe compter les valeurs uniques d'une colonne:

test.json
{"name":"Yin", "address":1111111, "date":20151122045510}
{"name":"Yin", "address":1111111, "date":20151122045501}
{"name":"Yln", "address":1111111, "date":20151122045500}
{"name":"Yun", "address":1111112, "date":20151122065832}
{"name":"Yan", "address":1111113, "date":20160101003221}
{"name":"Yin", "address":1111111, "date":20160703045231}
{"name":"Yin", "address":1111114, "date":20150419134543}
{"name":"Yen", "address":1111115, "date":20151123174302}

Et le code:

import pyspark.sql.funcions as func
from pyspark.sql.types import TimestampType
from datetime import datetime

df_y = sqlContext.read.json("/user/test.json")
udf_dt = func.udf(lambda x: datetime.strptime(x, '%Y%m%d%H%M%S'), TimestampType())
df = df_y.withColumn('datetime', udf_dt(df_y.date))
df_g = df_y.groupby(func.hour(df_y.date))    
df_g.count().distinct().show()

Les résultats avec pyspark sont

df_y.groupby(df_y.name).count().distinct().show()
+----+-----+
|name|count|
+----+-----+
| Yan|    1|
| Yun|    1|
| Yin|    4|
| Yen|    1|
| Yln|    1|
+----+-----+

Et ce que j'attends, c'est quelque chose comme ça avec les pandas:

df = df_y.toPandas()
df.groupby('name').address.nunique()
Out[51]: 
name
Yan    1
Yen    1
Yin    2
Yln    1
Yun    1

Comment puis-je obtenir les éléments uniques de chaque groupe par un autre champ, comme l'adresse?

23
Ivan

Il existe un moyen de faire ce décompte d'éléments distincts de chaque groupe en utilisant la fonction countDistinct:

import pyspark.sql.functions as func
from pyspark.sql.types import TimestampType
from datetime import datetime

df_y = sqlContext.read.json("/user/test.json")
udf_dt = func.udf(lambda x: datetime.strptime(x, '%Y%m%d%H%M%S'), TimestampType())
df = df_y.withColumn('datetime', udf_dt(df_y.date))
df_g = df_y.groupby(func.hour(df_y.date))    
df_y.groupby(df_y.name).agg(func.countDistinct('address')).show()

+----+--------------+
|name|count(address)|
+----+--------------+
| Yan|             1|
| Yun|             1|
| Yin|             2|
| Yen|             1|
| Yln|             1|
+----+--------------+

Les documents sont disponibles [ici] ( https://spark.Apache.org/docs/1.6.0/api/Java/org/Apache/spark/sql/functions.html#countDistinct (org.Apache. spark.sql.Column , org.Apache.spark.sql.Column ...)).

35
Ivan

une réponse concise et directe pour grouper un champ "_c1" et compter le nombre distinct de valeurs du champ "_c2":

import pyspark.sql.functions as F

dg = df.groupBy("_c1").agg(F.countDistinct("_c2"))
4
Quetzalcoatl