在Pyspark中使用时,具有静态文件相关性的python包无法读取静态文件

时间:2018-06-24 23:00:04

标签: python python-2.7 pyspark

我正在尝试解决python软件包PySpark的问题。我开发了一个具有以下结构的python程序包。

sample_package/
  |-config/
       |-sample.ini
  |-main.py
  |-__init__.py

在我的main.py内,有一个代码段,它从config/目录中读取配置文件,如下所示:

import ConfigParser, os
def sample_func():
    config = ConfigParser.ConfigParser()
    configfile = os.path.join(os.path.dirname(__file__), 'config', 'sample.ini')
    config.read(configfile)
    return config.sections()

我为上述软件包创建了一个sample_package.zip的zip文件,并将该zip文件作为pyspark依赖项

addPyFile(path/to/zip/file)

在我的pyspark作业中,当我导入sample_package时,导入工作正常,并且可以在main内部调用sample_func,但是我的python包无法读取{{1} }文件。当在普通的python程序中执行时,它可以正常工作,但在pyspark作业中却不能。在访问静态文件时,在pyspark环境中是否进行了任何路径操作?如何获取我的python软件包以正确读取配置文件?

2 个答案:

答案 0 :(得分:0)

我自己找出答案。更多的是python打包问题,而不是pyspark环境问题。看来我不得不使用pkgutil模块来引用我的静态资源,这修改了我的功能,如下所示:

import ConfigParser, os, pkgutil, StringIO
def sample_func():
    config = ConfigParser.ConfigParser()
    configfile = pkgutil.get_data('sample_package', 'config/sample.ini')
    cf_buf = StringIO.StringIO(configfile)
    config.readfp(cf_buf)
    return config.sections()

答案 1 :(得分:0)

更简单的版本:

from configparser import ConfigParser
import pkgutil

def sample_func():
    config = ConfigParser()
    # os.path.join is not needed.
    config_data = pkgutil.get_data(__name__, 'config/sample.ini').decode()
    config.read_string(config_data)
    return config.sections()