使用map reduce更新全局变量

hyrbngr7  于 2021-05-27  发布在  Spark
关注(0)|答案(1)|浏览(416)

假设我在Pypark里有这个:

def condi( x ):
    if x["age"] <= 2:
        return True
    else:
        return False

def add_count( x ):
    global aa
    aa += 1
    x["count"] += 10000
    return x

sc = pyspark.SparkContext(  master = 'spark://192.168.56.103:7077',appName = 'test' )

data = [{"age":1,"count":10},{"age":2,"count":20},{"age":3,"count":30}]

data = sc.parallelize( data )

global aa
aa = 0

k = data.map( lambda x : add_count( x ) if condi( x ) else x )

print( k.collect() )
print( aa )

输出如下:

[{'count': 10010, 'age': 1}, {'count': 10020, 'age': 2}, {'count': 30, 'age': 3}] # data
0 # aa

全局变量 aa 完全不修改。
如何使用map reduce修改全局变量?

wqsoz72f

wqsoz72f1#

你需要申报 aa 作为累加器,它将由所有执行者共享。请使用

aa = sc.accumulator(0)

而不是

aa = 0

更改后,打印出的值将 2 .
说明:每个执行器都使用自己的变量本地副本。所以把+1加到 aa 在执行器上不更改 aa 在司机身上。声明 print( aa ) 在驱动程序上执行,因此看不到执行器上的更改。
你也可以检查这个问题。

相关问题