以下代码片段尝试将简单函数应用于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
我将parse_line
函数替换为以下内容:
def parse_line(line):
ret = h:line[i] for (i, h) in enumerate(header)
ret['dir'] = dir()
return ret
现在,创建了数据框,dir
列显示了命名空间
该函数只包含两个对象:line
和ret
。如何将其他模块和对象作为函数的一部分?
不仅是pyspark,还有其他人。
编辑请注意,该程序中提供了pyspark。仅当map
调用该函数时(我假设filter
,reduce
和其他函数),它才会看到任何导入的模块。
答案 0 :(得分:1)
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或从源安装)。