Python 在PySpark中应用自定义函数时使用外部模块

Python 在PySpark中应用自定义函数时使用外部模块,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,以下代码段尝试将简单函数应用于PySpark RDD对象: import pyspark conf = pyspark.SparkConf() conf.set('spark.dynamicAllocation.minExecutors', 5) sc = SparkContext(appName="tmp", conf=conf) sc.setLogLevel('WARN') fn = 'my_csv_file' rdd = sc.textFile(fn) rdd = rdd.map(lam

以下代码段尝试将简单函数应用于PySpark RDD对象:

import pyspark
conf = pyspark.SparkConf()
conf.set('spark.dynamicAllocation.minExecutors', 5)
sc = SparkContext(appName="tmp", conf=conf)
sc.setLogLevel('WARN')

fn = 'my_csv_file'
rdd = sc.textFile(fn)
rdd = rdd.map(lambda line: line.split(","))
header = rdd.first()
rdd = rdd.filter(lambda line:line != header)
def parse_line(line):
    ret = pyspark.Row(**{h:line[i] for (i, h) in enumerate(header)})
    return ret
rows = rdd.map(lambda line: parse_line(line))
sdf = rows.toDF()
如果我用python my_snippet.py启动程序,它会抱怨失败:

File "<ipython-input-27-8e46d56b2984>", line 6, in <lambda>
File "<ipython-input-27-8e46d56b2984>", line 3, in parse_line
NameError: global name 'pyspark' is not defined
现在,数据框被创建,并且
dir
列显示了其中的名称空间 该函数只包含两个对象:
line
ret
。如何将其他模块和对象作为函数的一部分? 不仅Pypark,还有其他人

编辑注意,pyspark在程序中可用。只有通过
map
(并且,我假设
filter
reduce
等)调用该函数时,它才不会看到任何导入的模块。

1)回答原始问题: 问题的根源似乎是运行python my_snippet.py 您应该使用spark submit my_snippet.py执行代码

2) 对ipython笔记本问题的回答: 在我的ipython笔记本个人配置中,以下行不存在:

import pyspark
conf = pyspark.SparkConf()
conf.set('spark.dynamicAllocation.minExecutors', 5)
sc = SparkContext(appName="tmp", conf=conf)
“sc”的定义超出了我的课程范围

3) 关于numpy(或需要安装的其他模块)的问题解答
为了使用numpy,您需要在集群中的每个节点上安装numpy(使用apt-get或pip或install-from-sources)

以下答案是否回答了您的问题?您是对的,运行
spark submit
可以解决单机程序的问题。另一方面,如果我想运行IPython笔记本,这将不起作用。我可以使用
IPython_OPTS=“notebook”pyspark
启动IPython,但在运行期间我不能更改
SparkContext
选项(可以吗?)。此外,如果函数使用
numpy
或任何其他模块而不是
pyspark
,则
spark submit
也不会有帮助
import pyspark
conf = pyspark.SparkConf()
conf.set('spark.dynamicAllocation.minExecutors', 5)
sc = SparkContext(appName="tmp", conf=conf)