pyspark 如何调用自己写的.py文件

1,725 阅读1分钟

1、先说结论

  • 使用SparkContext类中的addPyFile(path)方法

2、稍作解释

  • 上面方法在spark官方文档中的描述如下
  • Add a .py or .zip dependency for all tasks to be executed on this SparkContext in the future
  • 字面意思,就是将加入的.py文件在后续为这个SparkContext所有的任务执行时提供依赖。
  • 我的理解,spark有一个依赖库,addPyFile之后为在依赖库里生成一个临时文件,供程序调用。这也是为什么不进行这一步,直接import xxxx后运行程序时,spark会报错“ImportError: No module name xxxx”。

3、所遇问题

  • 在2.x及之后版本的pyspark中,直接上来就是
  • spark = SparkSession.builder.config(conf=conf).getOrCreate()
  • 并没有发现SparkContext的踪迹,也就无法调用addPyFile(path)方法

4、SparkSession和SparkContext

  • 既然能够上来就用SparkSession,那SparkContext必然与其有着联系
  • spark在2.x之前,对于不同的功能,需要使用不同的Context
    • 创建和操作RDD时,使用SparkContext
    • 使用Streaming时,使用StreamingContext
    • 使用SQL时,使用sqlContext
    • 使用Hive时,使用HiveContext
  • spark在2.x之后,引入了SparkSession的概念,方便统一上述的各种Context。
  • 即SparkSession也就是SparkContext,sqlContext,HiveContext的组合

5、解决方法

  • 如上所知,SparkContext是SparkSession的一部分。
  • 于是就可以SparkSession.sparkContext.addPyFile(path)来将我们所需的.py文件放入到spark基于RDD计算时的依赖库里。