En PySpark 1.5.0, ¿cómo listan todos los elementos de la columna `y` en función de los valores de la columna` x`?

La siguiente pregunta es específica para la versión 1.5.0 de PySpark, ya que las nuevas funciones se agregan constantemente a PySpark.

¿Cómo se enumeran todos los elementos de la columna y función de los valores de la columna x ? Por ejemplo:

 rdd = sc.parallelize([ {'x': "foo", 'y': 1}, {'x': "foo", 'y': 1}, {'x': "bar", 'y': 10}, {'x': "bar", 'y': 2}, {'x': 'qux', 'y':999}]) df = sqlCtx.createDataFrame(rdd) df.show() +---+---+ | x| y| +---+---+ |foo| 1| |foo| 1| |bar| 10| |bar| 2| |qux|999| +---+---+ 

Me gustaría tener algo como:

 +---+--------+ | x| y | +---+--------+ |foo| [1, 1] | |bar| [10, 2]| |bar| [999] | +---+--------+ 

El orden no importa. En Pandas, puedo lograr este grupo de usuarios por:

 pd = df.toPandas() pd.groupby('x')['y'].apply(list).reset_index() 

Sin embargo, la funcionalidad de agregación groupBy la groupBy 1.5.0 parece ser muy limitada. ¿Alguna idea de cómo superar esta limitación?

Puedes usar collect_list Hive UDAF:

 from pyspark.sql.functions import expr from pyspark import HiveContext sqlContext = HiveContext(sc) df = sqlContext.createDataFrame(rdd) df.groupBy("x").agg(expr("collect_list(y) AS y")) 

En 1.6 o posterior puedes usar la función collect_list:

 from pyspark.sql.functions import collect_list df.groupBy("x").agg(collect_list(y).alias("y")) 

y en 2.0 o posterior puede usarlo sin soporte de Hive.

Sin embargo, esta no es una operación particularmente eficiente, por lo que debe usarla con moderación.

Además, no utilice diccionarios para la inferencia de esquemas. Ha sido desaprobado desde 1.2