以下问题特定于PySpark 1.5.0版,因为新功能不断添加到PySpark。
如何根据列y的值列出列的所有项目x?例如:
y
x
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| +---+---+
我想要类似的东西:
+---+--------+ | x| y | +---+--------+ |foo| [1, 1] | |bar| [10, 2]| |bar| [999] | +---+--------+
顺序无关紧要。在Pandas中,我可以通过以下方式来实现这一高贵的目标:
pd = df.toPandas() pd.groupby('x')['y'].apply(list).reset_index()
但是,版本groupBy1.5.0中的聚合功能似乎非常有限。任何想法如何克服此限制?
groupBy
您可以使用collect_listHive UDAF:
collect_list
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"))
在1.6或更高版本中,可以使用collect_list函数:
from pyspark.sql.functions import collect_list df.groupBy("x").agg(collect_list(y).alias("y"))
在2.0或更高版本中,无需Hive支持即可使用它。
但是,这并不是特别有效的操作,因此您应适度使用它。
另外,请勿使用字典进行模式推断。从1.2开始不推荐使用