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

CombineByKey可以与pyspark python 2配合使用,但不能与python 3配合使用

  •  0
  • Ged  · 技术社区  · 5 年前

    使用python2的pyspark可以实现以下功能:

    data = [
        ('A', 2.), ('A', 4.), ('A', 9.), 
        ('B', 10.), ('B', 20.), 
        ('Z', 3.), ('Z', 5.), ('Z', 8.), ('Z', 12.) 
          ]
    
    rdd = sc.parallelize( data )
    
    sumCount = rdd.combineByKey(lambda value: (value, 1),
                            lambda x, value: (x[0] + value, x[1] + 1),
                            lambda x, y: (x[0] + y[0], x[1] + y[1])
                               )
    
    averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
    averageByKey.collectAsMap()
    

    台词:

    averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
    

    python3下的返回:

    SyntaxError: invalid syntax
      File "<command-2372155099811162>", line 14
        averageByKey = sumCount.map(lambda (key, (totalSum, count)): (key, totalSum / count))
    

    找不到是什么python3变化导致了这种情况和替代方案。

    0 回复  |  直到 5 年前
        1
  •  0
  •   Ged    5 年前

    使用python3的pyspark中的以下代码有效:

    data         = sc.parallelize( [(0, 2.), (0, 4.), (1, 0.), (1, 10.), (1, 20.)] )
    
    sumCount     = data.combineByKey(lambda value: (value, 1),
                                     lambda x, value: (x[0] + value, x[1] + 1),
                                     lambda x, y: (x[0] + y[0], x[1] + y[1]))
    
    averageByKey = sumCount.map(lambda label_value_sum_count: (label_value_sum_count[0], label_value_sum_count[1][0] / label_value_sum_count[1][1]))
    
    print(averageByKey.collectAsMap()) 
    

    正确返回:

    {0: 3.0, 1: 10.0}
    

    蟒蛇2&python3和python2有一些不同之处,有很多不同之处。