pyspark-fold and sum with arraytype列

3htmauhk  于 2021-07-09  发布在  Spark
关注(0)|答案(1)|浏览(401)

我试图做一个元素的求和,我已经创建了这个虚拟的df。输出应该是 [10,4,4,1] ```
from pyspark.sql.types import StructType,StructField, StringType, IntegerType, ArrayType
data = [
("James",[1,1,1,1]),
("James",[2,1,1,0]),
("James",[3,1,1,0]),
("James",[4,1,1,0])
]

schema = StructType([
StructField("firstname",StringType(),True),
StructField("scores", ArrayType(IntegerType()), True)
])

df = spark.createDataFrame(data=data,schema=schema)

posexplode可以工作,但是我的实际df太大了,所以我尝试使用fold,但是它给了我一个错误。有什么想法吗?谢谢!

vec_df = df.select("scores")
vec_sums = vec_df.rdd.fold([0]*4, lambda a,b: [x + y for x, y in zip(a, b)])

文件“<ipython-input-115-9b470dedcfef>”,第2行,在<listcomp>
typeerror:不支持+:“int”和“list”的操作数类型
snvhrwxg

snvhrwxg1#

之前需要将行的rddMap到列表的rdd fold :

vec_sums = vec_df.rdd.map(lambda x: x[0]).fold([0]*4, lambda a,b: [x + y for x, y in zip(a, b)])

为了帮助理解,您可以查看RDD的外观。

>>> vec_df.rdd.collect()
[Row(scores=[1, 1, 1, 1]), Row(scores=[2, 1, 1, 0]), Row(scores=[3, 1, 1, 0]), Row(scores=[4, 1, 1, 0])]

>>> vec_df.rdd.map(lambda x: x[0]).collect()
[[1, 1, 1, 1], [2, 1, 1, 0], [3, 1, 1, 0], [4, 1, 1, 0]]

所以你可以想象 vec_df.rdd 包含嵌套列表,需要在 fold .

相关问题