将 AWS Glue Python 与 NumPy 和 Pandas Python 包一起使用

Use AWS Glue Python with NumPy and Pandas Python Packages

在 AWS 上名为 Glue 的新 ETL 工具中使用 NumPy 和 Pandas 等包的最简单方法是什么?我在 Python 中有一个完整的脚本我想 运行 在 AWS Glue 中使用 NumPy 和 Pandas.

如果您去编辑一份工作(或者当您创建一个新工作时),有一个折叠的可选部分,称为 "Script libraries and job parameters (optional)"。在那里,您可以为 Python 个库(以及其他东西)指定一个 S3 存储桶。我还没有亲自尝试过这部分,但我想这就是你要找的。

当您单击 运行 作业时,您有一个默认折叠的作业参数按钮(可选),当我们单击它时,我们有以下选项,我们可以使用这些选项将库保存在 s3 和这对我有用:

Python 库路径

s3://bucket-name/folder-name/file-name

依赖的 jars 路径

s3://bucket-name/folder-name/file-name

引用的文件路径 s3://bucket-name/folder-name/file-name

我认为目前的答案是你不能。根据AWS Glue Documentation:

Only pure Python libraries can be used. Libraries that rely on C extensions, such as the pandas Python Data Analysis Library, are not yet supported.

但即使我尝试在 S3 中包含一个正常的 python 编写的库,Glue 作业也会因为一些 HDFS 权限问题而失败。如果你找到解决这个问题的方法,也请告诉我。

如果您想将 python 个模块集成到您的 AWS GLUE ETL 作业中,您可以这样做。你可以使用任何你想要的 Python 模块。

因为 Glue 只不过是 Python 运行 环境的无服务器。因此,您只需要使用 pip install -t /path/to/your/directory 打包您的脚本所需的模块。然后上传到你的s3 bucket。

并且在创建 AWS Glue 作业时,在指向 s3 脚本、临时位置之后,如果您转到高级作业参数选项,您将在那里看到 python_libraries 选项。

enter image description here

您可以将其指向您上传到 s3 的 python 个模块包。

截至目前,您可以将 Python 扩展模块和库与您的 AWS Glue ETL 脚本一起使用,只要它们是用纯 Python 编写的。目前不支持 pandas 等 C 库,也不支持用其他语言编写的扩展。

有更新:

...您现在可以使用 Python shell 个职位... ...Python shell AWS Glue 中的作业支持与 Python 2.7 兼容的脚本,并预加载了 Boto3、NumPy、SciPy、pandas,以及其他人。

https://aws.amazon.com/about-aws/whats-new/2019/01/introducing-python-shell-jobs-in-aws-glue/

如果您没有纯 python 库但仍想使用,则可以使用以下脚本在您的 Glue 代码中使用它:

import os
import site
from setuptools.command import easy_install
install_path = os.environ['GLUE_INSTALLATION']
easy_install.main( ["--install-dir", install_path, "<library-name>"] )
reload(site)


import <installed library>

为了安装特定版本(例如,对于 AWS Glue python 作业),导航到包含 python 包的网站,对于包页面的示例 "pg8000" https://pypi.org/project/pg8000/1.12.5/#files

然后 select 一个合适的版本,将 link 复制到文件中,然后将其粘贴到下面的代码段中:

import os
import site
from setuptools.command import easy_install
install_path = os.environ['GLUE_INSTALLATION']

easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/83/03/10902758730d5cc705c0d1dd47072b6216edc652bc2e63a078b58c0b32e6/pg8000-1.12.5.tar.gz"] )
reload(site)

所选答案自 2019 年起不再正确

awswrangler 就是您所需要的。 它允许你在 glue 和 lambda

中使用 pandas

https://github.com/awslabs/aws-data-wrangler

使用 AWS Lambda 层安装

https://aws-data-wrangler.readthedocs.io/en/latest/install.html#setting-up-lambda-layer

示例:典型 Pandas ETL

import pandas
import awswrangler as wr

df = pandas.read_...  # Read from anywhere

# Typical Pandas, Numpy or Pyarrow transformation HERE!

wr.pandas.to_parquet(  # Storing the data and metadata to Data Lake
    dataframe=df,
    database="database",
    path="s3://...",
    partition_cols=["col_name"],
)

您可以检查使用此脚本作为粘合作业安装的最新 python 个软件包

import logging
import pip
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

if __name__ == '__main__':
    logger.info(pip._internal.main(['list']))

30-Jun-2020 开始,Glue as 已预安装这些 python 软件包。所以 numpypandas 被覆盖了。

awscli 1.16.242
boto3 1.9.203
botocore 1.12.232
certifi 2020.4.5.1
chardet 3.0.4
colorama 0.3.9
docutils 0.15.2
idna 2.8
jmespath 0.9.4
numpy 1.16.2
pandas 0.24.2
pip 20.0.2
pyasn1 0.4.8
PyGreSQL 5.0.6
python-dateutil 2.8.1
pytz 2019.3
PyYAML 5.2
requests 2.22.0
rsa 3.4.2
s3transfer 0.2.1
scikit-learn 0.20.3
scipy 1.2.1
setuptools 45.1.0
six 1.14.0
urllib3 1.25.8
virtualenv 16.7.9
wheel 0.34.2

如果用于构建附加 .whlrequirements.txt 中存在其他包,您可以在 glue-python 中安装它们。 whl 文件在您的脚本启动之前被收集并安装。我还建议您查看 Sagemaker Processing,这对于基于 python 的工作来说更容易。与 glue-python shell 的无服务器实例不同,您在那里不限于 16gb 的限制。

2020 年 8 月发布的 AWS Glue 2.0 版现已默认安装 pandas 和 numpy。 有关详细信息,请参阅 https://docs.aws.amazon.com/glue/latest/dg/reduced-start-times-spark-etl-jobs.html#reduced-start-times-new-features

AWS GLUE library/Dependency 有点复杂

基本上可以通过三种方式添加所需的包

方法一

  1. 通过 AAWS 控制台 UI/JOB 定义,下面是一些帮助的屏幕
    操作 --> 编辑作业

    然后一直向下滚动并展开

    安全配置、脚本库和作业参数(可选)

    然后将所有包作为 .zip 文件添加到 Python 库路径 (您需要将 .zip 文件添加到 S3,然后指定路径)

    这里有一个问题是您需要确保您的 zip 文件必须包含 init.py 根文件夹

而且,如果您的包依赖于另一个包,那么将很难添加这些包。

方法二

以编程方式安装您的包(简单的)

这里是安装所需库的路径

/home/spark/.local/lib/python3.7/site-packages/

**

/home/spark/.local/lib/python3.7/site-packages/

**

这里是安装AWS包的例子 我在这里安装了 SAGE 标记包

import site
from importlib import reload 
from setuptools.command import easy_install
# install_path = site.getsitepackages()[0]
install_path = '/home/spark/.local/lib/python3.7/site-packages/'
easy_install.main( ["--install-dir", install_path, "https://files.pythonhosted.org/packages/60/c7/126ad8e7dfbffaf9a5384ca6123da85db6c7b4b4479440ce88c94d2bb23f/sagemaker-2.3.0.tar.gz"] )
reload(site)

方法 3.(建议和清洁)

安全配置、脚本库和作业参数(可选) 部分到 作业参数

使用--additional-python-modules参数添加需要的库 您可以使用逗号分隔符根据需要指定尽可能多的包

乐于助人

使用 Glue 版本 2 而不是版本 3 步骤:

  1. 转到粘合作业并使用以下代码编辑脚本

代码:

import sys
from awsglue.transforms import *
from awsglue.utils import getResolvedOptions
from pyspark.context import SparkContext
from awsglue.context import GlueContext
from awsglue.job import Job
import pandas as pd

args = getResolvedOptions(sys.argv, ['JOB_NAME'])

sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)


excel_path= r"s3://input/employee.xlsx"
df_xl_op = pd.read_excel(excel_path,sheet_name = "Sheet1")
df=df_xl_op.applymap(str)
input_df = spark.createDataFrame(df)
input_df.printSchema()

job.commit()
  1. 保存脚本

  2. 转到操作 - 编辑作业 - Select 粘贴版本 2 并在安全配置下设置密钥值

    键:--additional-python-modules
    值:pandas==1.2.4,xlrd==1.2.0,numpy==1.20.1,fsspec==0.7.4

  3. 保存并运行作业

它将解决您的错误,您将能够使用 pandas

读取 excel 文件