我正在尝试使用 AWS Lambda 在 S3 中加载、处理和写入 Parquet 文件。我的测试/部署过程是:
- https://github.com/lambci/docker-lambda作为模拟 Amazon 环境的容器,因为需要安装本地库(numpy 等)。
- 此程序生成一个 zip 文件:http://docs.aws.amazon.com/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python
- 在zip中添加一个测试python函数,将它发送到S3,更新lambda并测试它
似乎有两种可能的方法,都在 docker 容器本地工作:
- 带有 s3fs 的 fastparquet:不幸的是,包的解压缩大小大于 256MB,因此我无法用它更新 Lambda 代码。
带有 s3fs 的 pyarrow:我关注了 https://github.com/apache/arrow/pull/916当使用 lambda 函数执行时,我得到:
- 如果我在 URI 前加上 S3 或 S3N(如代码示例中所示):在 Lambda 环境中
OSError: Passed non-file path: s3://mybucket/path/to/myfile
in pyarrow/parquet.py, line 848. 在本地我得到IndexError: list index out of range
in pyarrow/parquet.py, line 714 - 如果我不使用 S3 或 S3N 作为 URI 的前缀:它在本地工作(我可以读取 parquet 数据)。在 Lambda 环境中,我在 pyarrow/parquet.py 的第 848 行中得到相同的
OSError: Passed non-file path: s3://mybucket/path/to/myfile
。
- 如果我在 URI 前加上 S3 或 S3N(如代码示例中所示):在 Lambda 环境中
我的问题是:
- 为什么我在 docker 容器中得到的结果与在 Lambda 环境中得到的结果不同?
- 提供 URI 的正确方法是什么?
- 是否有一种公认的方法可以通过 AWS Lambda 读取 S3 中的 Parquet 文件?
谢谢!
最佳答案
AWS 有一个项目 ( AWS Data Wrangler ) 允许它具有完整的 Lambda 层支持。
在文档中有一个 step-by-step去做。
代码示例:
import awswrangler as wr
# Write
wr.s3.to_parquet(
dataframe=df,
path="s3://...",
dataset=True,
database="my_database", # Optional, only with you want it available on Athena/Glue Catalog
table="my_table",
partition_cols=["PARTITION_COL_NAME"])
# READ
df = wr.s3.read_parquet(path="s3://...")
关于python - 使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984322/