【问题标题】:A python package with static file dependency fails to read static file when used within Pyspark在 Pyspark 中使用时,具有静态文件依赖性的 python 包无法读取静态文件
【发布时间】:2020-08-17 11:06:33
【问题描述】:

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

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

在我的main.py 中,我有一个代码 sn-p,它从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()

我将上述包的 zip 文件创建为 sample_package.zip,并将 zip 包含为 pyspark 依赖项

addPyFile(path/to/zip/file)

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

【问题讨论】:

    标签: python python-2.7 pyspark


    【解决方案1】:

    我自己想出了答案。这更像是一个 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()
    

    【讨论】:

      【解决方案2】:

      更简单的版本:

      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()
      

      【讨论】:

        猜你喜欢
        • 2011-08-27
        • 1970-01-01
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 2019-03-05
        • 1970-01-01
        • 2017-02-22
        • 2020-04-08
        相关资源
        最近更新 更多