如何将pip / pypi安装的python包转换为要在AWS Glue中使用的zip文件

我正在使用AWS Glue和PySpark ETL脚本,并希望使用辅助库(如google_cloud_bigquery)作为PySpark脚本的一部分.

documentation states this should be possible. This previous Stack Overflow discussion,特别是其中一个答案的评论似乎提供了额外的证据.但是,如何做到这一点我不清楚.

因此,目标是将pip安装的包转换为一个或多个zip文件,以便能够在S3上托管包并指向它们,如下所示:

S3://bucket/prefix/lib_A.zip,s3://bucket_B/prefix/lib_X.zip

在我看过的任何地方都没有明确说明如何做到这一点.

即我如何pip安装包,然后将其转换为我可以上传到S3的zip文件,以便PySpark可以将它与这样的S3 URL一起使用?

通过使用命令pip download我已经能够获取libs,但默认情况下它们不是.zip文件,而是.whl文件或.tar.gz

..所以不知道如何将它们变成AWS Glue可以消化的zip文件.也许用.tar.gz我可以只是tar -xf然后将它们拉回来,但是whl文件怎么样?

解决方法:

因此,在浏览过去48小时内我在评论中提供的材料后,我就是这样解决问题的.

注意:我使用Python2.7,因为这是AWS Glue似乎附带的内容.

按照E. Kampf’s blog post “Best Practices Writing Production-Grade PySpark Jobs”this stack overflow answer中的说明进行操作,以及由于随机错误导致的一些调整,我做了以下操作:

>创建一个名为ziplib的新项目文件夹并将其cd入其中:

mkdir ziplib&& cd ziplib

>在每行上创建一个包含名称包的requirements.txt文件.
>在其中创建一个名为deps的文件夹:

mkdir deps

>在当前文件夹中使用python 2.7创建一个新的virtualenv环境:

virtualenv -p python2.7.

>使用ABSOLUTE路径将需求安装到文件夹deps中(否则将无效):

bin / pip2.7 install -r requirements.txt –install-option –install-lib =“/ absolute / path / to /…/ ziplib / deps”

> cd进入deps文件夹并将其内容压缩到父文件夹中的zip archive deps.zip,然后cd退出deps文件夹:

cd deps&& zip -r ../deps.zip. &安培;&安培; cd ..

..所以现在我有一个zip文件,如果我把它放到AWS S3上并从AWS Glue上的PySpark指向它,它似乎工作.

但是……我无法解决的问题是,由于某些软件包(例如Google Cloud Python客户端库)使用的是所谓的Implicit Namespace Packages (PEP-420),因此它们没有通常存在于模块中的__init__.py文件,因此导入语句不起作用.我在这里不知所措.

上一篇:python-如何在数据框的一列中添加字符串并形成另一列,该列将具有原始列的增量值


下一篇:python – PySpark,通过JSON文件导入模式