如何在PySpark Shell外部运行脚本?解决sc未定义报错
解决PySpark脚本中
sc未定义的问题 老哥,你碰到的这个问题太常见了——咱们先搞清楚为啥会报错:PySpark Shell启动时会自动帮你初始化好sc(SparkContext)和spark(SparkSession)这两个核心对象,但当你用spark-submit运行独立脚本,或者在Shell里import外部模块时,这些对象不会自动生成,直接用sc自然就会报NameError。
下面给你两种场景的解决方案:
1. 用spark-submit运行独立脚本的正确写法
Spark 2.0+版本更推荐用SparkSession(它包含了SparkContext的所有功能,是统一的入口),当然也可以直接初始化SparkContext,两种写法都给你:
写法一:用SparkSession(推荐)
修改你的m.py为:
from pyspark.sql import SparkSession # 初始化SparkSession,设置应用名称和运行模式 spark = SparkSession.builder \ .appName("MySampleApp") \ .master("local[*]") # local模式适合本地测试,生产环境去掉这句,用spark-submit的--master参数指定 .getOrCreate() # 从SparkSession获取SparkContext sc = spark.sparkContext l = [1,2,3,4,7,5,6,7,8,9,0] k = sc.parallelize(l) print(type(k)) # 最后记得关闭SparkSession spark.stop()
写法二:直接初始化SparkContext
from pyspark import SparkContext, SparkConf # 配置Spark参数 conf = SparkConf() \ .setAppName("MySampleApp") \ .setMaster("local[*]") sc = SparkContext(conf=conf) l = [1,2,3,4,7,5,6,7,8,9,0] k = sc.parallelize(l) print(type(k)) sc.stop()
修改完后再执行spark-submit m.py,就不会报错了。
2. 在PySpark Shell中import m.py的处理方式
如果要在PySpark Shell里导入你的模块,没必要在模块里重新初始化sc,直接利用Shell已经创建好的sc就行。可以把模块改成函数形式,接收sc作为参数:
修改m.py:
def get_rdd_type(sc): l = [1,2,3,4,7,5,6,7,8,9,0] k = sc.parallelize(l) return type(k)
然后在PySpark Shell里执行:
import m print(m.get_rdd_type(sc))
这样就能正常运行啦!
额外提醒
- 生产环境中不要在脚本里硬写
master("local[*]"),应该通过spark-submit的--master参数指定集群地址(比如--master yarn或者--spark://host:port),脚本里的master配置会被命令行参数覆盖。 - Spark 3.x版本的SparkSession初始化写法和上面兼容,不用额外调整。
内容的提问来源于stack exchange,提问作者Karan Sawlani
相关产品推荐
相关产品推荐

