如何在groupBy聚合函数中使用BitwiseOR操作

时间:2019-08-22 08:12:40

标签: python apache-spark pyspark

如何在pySpark Dataframe.groupBy中将bitwiseOR用作聚合函数,是否有诸如sum之类的内置函数可以为我做到这一点?

1 个答案:

答案 0 :(得分:0)

Pyspark中没有内置的按位或聚合功能。

如果您的列是布尔型,则只需使用df.agg(F.sum('colA'))

否则,您必须创建一个自定义的聚合函数。

有三种方法:

1-最快的是在Pyspark调用的Scala中实现自定义聚合功能。

2-使用UDF:

from pyspark.sql import functions as F
from pyspark.sql.types import IntegerType

def bitwiseOr(l):
    return reduce(lambda x,y: x | y, l)  # In Python 3, use `from functools import reduce`

udf_bitwiseOr = F.udf(bitwiseOr, IntegerType())
df.agg(udf_bitwiseOr(F.collect_list('colA'))).show()

3-使用RDD:

seqOp = (lambda local_result, row: local_result | row['colA'] )
combOp = (lambda local_result1, local_result2: local_result1 | local_result2)
rdd = df.rdd
rdd.aggregate(0, seqOp, combOp)

方法2和方法3具有相似的表现