Tengo que hacer una agrupación de 2 niveles en un marco de datos pyspark. Mi tentativa:

grouped_df=df.groupby(["A","B","C"])
grouped_df.groupby(["C"]).count()

Pero obtengo el siguiente error:

'GroupedData' object has no attribute 'groupby'

Supongo que primero debería convertir el objeto agrupado en un pySpark DF. Pero no puedo hacer eso.

¿Alguna sugerencia?

3
Mauro Gentile 18 oct. 2017 a las 15:11

3 respuestas

La mejor respuesta

Tuve el mismo problema. La forma en que lo resolví fue haciendo primero un "count ()" después del primer groupby, porque eso devuelve un Spark DataFrame, en lugar del objeto GroupedData. Luego puede hacer otro groupby en ese DataFrame devuelto.

Entonces intenta:

grouped_df=df.groupby(["A","B","C"]).count()
grouped_df.groupby(["C"]).count()
5
M. Rubins 14 dic. 2017 a las 23:23

La función DataFrame.groupBy(cols) devuelve un objeto GroupedData. Para convertir un objeto GroupedData de nuevo en un DataFrame, deberá utilizar una de las funciones GroupedData como mean(cols) avg(cols) count(). Un ejemplo usando su ejemplo es:

df = sqlContext.createDataFrame([['a', 'b', 'c'], ['a', 'b', 'c'], ['a', 'b', 'c']], schema=['A', 'B', 'C'])
df.show()

+---+---+---+
|  A|  B|  C|
+---+---+---+
|  a|  b|  c|
|  a|  b|  c|
|  a|  b|  c|
+---+---+---+

gdf = df.groupBy('C').count()
gdf.show()

+---+-----+
|  C|count|
+---+-----+
|  c|    3|
+---+-----+
0
Zac Roberts 16 sep. 2019 a las 19:29

https://spark.apache.org/docs/2.1.0/api/python/pyspark.sql.html#pyspark.sql.GroupedData

métodos pyspark.sql.GroupedData Aggregation, devueltos por DataFrame.groupBy ().

Un conjunto de métodos para agregaciones en un DataFrame, creado por DataFrame.groupBy ().

Puede usar una función de agregación como agg, avg, count, max, mean, min, pivot, sum, collect_list, collect_set, count, first, grouping, etc.

Atención a lo primero: esta función es una acción, puede hacer que su script sea más lento si hace un mal uso de esto.

Si tiene una columna numérica, puede usar la función de agregación, como min, max, mean, etc., pero si tiene una columna de cadena, puede usar:

df.groupBy("ID").pivot("VAR").agg(concat_ws('', collect_list(col("VAL"))))

O

df.groupBy("ID").pivot("VAR").agg(collect_list(collect_list("VAL")[0]))

O

df.groupBy("ID").pivot("VAR").agg(first("VAL"))
0
Lucas Mendes Mota Da Fonseca 3 jun. 2019 a las 20:17