Python Pypark don';无法识别作为参数传递给foreach或foreachPartition的方法上的env变量

Python Pypark don';无法识别作为参数传递给foreach或foreachPartition的方法上的env变量,python,apache-spark,pyspark,redis-py,Python,Apache Spark,Pyspark,Redis Py,在下面的代码中,我尝试实例化 在URL处使用env变量进行连接。问题是,当我使用env变量时,在#save_on_redis方法中无法识别 我只是尝试在外部创建redis连接,但收到“pickle.PicklingError:无法pickle'lock'对象”,因为spark尝试在所有节点上同时运行这两个方法 问题:如何在作为参数传递给foreach或foreachPartition的方法上使用env变量 我建议您在驱动程序进程中获取env变量,并将其作为python变量传递给工作进程,您可以使

在下面的代码中,我尝试实例化 在URL处使用env变量进行连接。问题是,当我使用env变量时,在#save_on_redis方法中无法识别

我只是尝试在外部创建redis连接,但收到“pickle.PicklingError:无法pickle'lock'对象”,因为spark尝试在所有节点上同时运行这两个方法

问题:如何在作为参数传递给foreach或foreachPartition的方法上使用env变量


我建议您在驱动程序进程中获取env变量,并将其作为python变量传递给工作进程,您可以使用
os.putenv

例如:

In [1]: import os

In [2]: a = sc.parallelize(range(20))

In [3]: os.getenv('MY_VAR')
Out[3]: 'some_value'

In [4]: def f(iter):
    import os
    return (str(os.getenv('MY_VAR')),)
   ...:

In [5]: a.mapPartitions(f).collect()
Out[5]: ['None', 'None']

In [6]: my_var = os.getenv('MY_VAR')

In [6]: def f2(iter):
    import os
    from subprocess import check_output
    os.putenv('MY_VAR', my_var)
    return (check_output('env | grep MY_VAR', shell=True), my_var)
   ....:

In [7]: a.mapPartitions(f2).collect()
Out[7]:
['MY_VAR=some_value\n',
 'some_value',
 'MY_VAR=some_value\n',
 'some_value']
PS.根据,最好直接修改
os.environ
映射对象,而不是使用
os.putenv

In [1]: import os

In [2]: a = sc.parallelize(range(20))

In [3]: os.getenv('MY_VAR')
Out[3]: 'some_value'

In [4]: def f(iter):
    import os
    return (str(os.getenv('MY_VAR')),)
   ...:

In [5]: a.mapPartitions(f).collect()
Out[5]: ['None', 'None']

In [6]: my_var = os.getenv('MY_VAR')

In [6]: def f2(iter):
    import os
    from subprocess import check_output
    os.putenv('MY_VAR', my_var)
    return (check_output('env | grep MY_VAR', shell=True), my_var)
   ....:

In [7]: a.mapPartitions(f2).collect()
Out[7]:
['MY_VAR=some_value\n',
 'some_value',
 'MY_VAR=some_value\n',
 'some_value']