假设我在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修改全局变量?
1条答案
按热度按时间wqsoz72f1#
你需要申报
aa
作为累加器,它将由所有执行者共享。请使用而不是
更改后,打印出的值将
2
.说明:每个执行器都使用自己的变量本地副本。所以把+1加到
aa
在执行器上不更改aa
在司机身上。声明print( aa )
在驱动程序上执行,因此看不到执行器上的更改。你也可以检查这个问题。