代码之家  ›  专栏  ›  技术社区  ›  user297850

pyspark中聚合(0,lambda,lambda)的用法

  •  0
  • user297850  · 技术社区  · 3 年前

    有一个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 .我们怎样才能得到它的内容?

    0 回复  |  直到 3 年前
        1
  •  1
  •   mck    3 年前

    根据the docs ,聚合过程:

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

    您可能将此聚合与数据帧的聚合方法混淆了。RDD是较低级别的对象,您不能在这里使用数据帧聚合方法,如avg/meand/等。

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