pyspark 中 aggregate(0, lambda,lambda) 的使用

the usage of aggregate(0, lambda,lambda) in pyspark

有pyspark代码段

seqOp = (lambda x,y: x+y)
sum_temp = df.rdd.map(lambda x: len(x.timestamp)).aggregate(0, seqOp, seqOp)

sum_temp的输出是一个数值。但我不清楚 aggregate(0, seqOp, seqOp) 是如何工作的。在我看来,通常情况下,aggregate 只使用像 "avg"

这样的单一函数形式

此外,df.rdd.map(lambda x: len(x.timestamp))pyspark.rdd.PipelinedRDD 类型。我们怎样才能得到它的内容?

根据docs,聚合过程:

  1. 从第一个参数开始为零值 (0),
  2. 然后使用第二个参数聚合RDD的每个分区,并且
  3. 最后使用第三个参数将聚合分区组合成最终结果。在这里,您对每个分区求和,然后将每个分区的总和求和为最终结果。

您可能将此聚合与数据帧的聚合方法混淆了。 RDDs是底层对象,你不能在这里使用dataframe聚合方法,比如avg/mean/etc.

要获取 RDD 的内容,您可以 rdd.take(1) 检查随机元素,或使用 rdd.collect() 检查整个 RDD(请注意,这会将所有数据收集到驱动程序中如果 RDD 很大,可能会导致内存错误。