我有下面的spark数据框架,其中id是int和属性是字符串列表
id | attributes
1 | ['a','c', 'd']
2 | ['a', 'e']
1 | ['e', 'f']
1 | ['g']
3 | ['a', 'b']
2 | ['e', 'g']
我需要执行一个聚合,其中将每个id的属性列表连接起来。聚合的结果是:
id | concat(attributes)
1 | ['a', 'c', 'd', 'e', 'f', 'g']
2 | ['a', 'e', 'e', 'g']
3 | ['a', 'b']
是否有一种方法来实现这使用python?
谢谢。
一种方法是使用reduceByKey:
创建一个新框架>>> df.show()
+---+----------+
| id|attributes|
+---+----------+
| 1| [a, c, d]|
| 2| [a, e]|
| 1| [e, f]|
| 1| [g]|
| 3| [a, b]|
| 2| [e, g]|
+---+----------+
>>> custom_list = df.rdd.reduceByKey(lambda x,y:x+y).collect()
>>> new_df = sqlCtx.createDataFrame(custom_list, ["id", "attributes"])
>>> new_df.show()
+---+------------------+
| id| attributes|
+---+------------------+
| 1|[a, c, d, e, f, g]|
| 2| [a, e, e, g]|
| 3| [a, b]|
+---+------------------+
reduceByKey (func [numTasks]):
当在(K, V)数据集上调用时返回(K, V)对的数据集,其中每个键的值聚合使用给定的减少函数函数,这必须是type (V,V) => V。与groupByKey一样,reduce任务个数为可通过第二个可选参数配置。