withcolumn tutorial sqlcontext spark manipulating dataframes data crear python apache-spark pyspark

python - tutorial - Obtenga los distintos elementos de cada grupo por otro campo en un Spark 1.6 Dataframe



sqlcontext spark python (1)

Hay una manera de hacer este recuento de elementos distintos de cada grupo usando la función 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| +----+--------------+

Los documentos están disponibles [aquí] ( 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 ...)).

Estoy intentando agrupar por fecha en un marco de datos de Spark y para cada grupo contar los valores únicos de una columna:

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}

Y el código:

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

Los resultados con pyspark son

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

Y lo que estoy esperando es algo como esto con los pandas:

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

¿Cómo puedo obtener los elementos únicos de cada grupo por otro campo, como la dirección?