在PySpark

时间:2016-03-20 08:32:55

标签: 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(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列显示了命名空间 该函数只包含两个对象:lineret。如何将其他模块和对象作为函数的一部分? 不仅是pyspark,还有其他人。

编辑请注意,该程序中提供了pyspark。仅当map调用该函数时(我假设filterreduce和其他函数),它才会看到任何导入的模块。

1 个答案:

答案 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或从源安装)。