【问题标题】:Custom aggregation on PySpark dataframes [duplicate]PySpark 数据帧上的自定义聚合 [重复]
【发布时间】:2017-04-22 21:51:56
【问题描述】:

我有一个 PySpark DataFrame,其中一列作为一个热编码向量。我想在 groupby 之后通过向量加法来聚合不同的一个热编码向量

例如df[userid,action] Row1: ["1234","[1,0,0]] Row2: ["1234", [0 1 0]]

我希望输出为行:["1234", [ 1 1 0]],因此该向量是由userid 分组的所有向量的总和。

我怎样才能做到这一点? PySpark sum 聚合操作不支持向量加法。

【问题讨论】:

标签: apache-spark pyspark apache-spark-sql aggregate-functions user-defined-functions


【解决方案1】:

您有多种选择:

  1. 创建用户定义的聚合函数。问题是您需要write the user defined aggregate function in scalawrap it to use in python
  2. 您可以使用 collect_list 函数将所有值收集到一个列表中,然后编写一个 UDF 来组合它们。
  3. 您可以移动到 RDD 并使用聚合或按键聚合。

选项 2 和 3 的效率都相对较低(同时消耗 CPU 和内存)。

【讨论】:

  • 我理解为什么 (2) 效率低,因为它会打乱所有数据以收集实际列表中的项目。但是为什么(3)效率低?
  • @ThomasB。 3 效率低,因为您将丢失所有数据帧优化(例如催化剂优化、整个阶段代码生成等),因为您的输入是数据帧,它还需要将数据从数据帧表示转换为 RDD 表示。最后,在python中所有的RDD操作基本上都是将数据序列化为python,让python对它们进行操作并返回结果,相对较慢。
猜你喜欢
  • 2016-10-09
  • 2016-06-29
  • 2021-06-18
  • 1970-01-01
  • 2019-10-08
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 2021-11-16
相关资源
最近更新 更多