用户定义的spark数据框架聚合函数(python)



我有下面的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任务个数为可通过第二个可选参数配置。

相关内容

  • 没有找到相关文章

最新更新