我正在尝试使用 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
- 将测试 python 函数添加到 zip 中,将其发送到 S3,更新 lambda 并测试它
似乎有两种可能的方法,两者都在 docker 容器本地工作:
- fastparquet with s3fs:不幸的是,解压后的包大小超过 256MB,因此我无法用它更新 Lambda 代码。
-
pyarrow 与 s3fs:我跟随https://github.com/apache/arrow/pull/916当使用 lambda 函数执行时,我得到:
-
如果我在 URI 中添加 S3 或 S3N 前缀(如代码示例中所示):在 Lambda 环境中
OSError: Passed non-file path: s3://mybucket/path/to/myfile
在 pyarrow/parquet.py,第 848 行。在本地我得到IndexError: list index out of range
在 pyarrow/parquet.py,第 714 行
-
如果我不使用 S3 或 S3N 作为 URI 前缀:它在本地工作(我可以读取镶木地板数据)。在 Lambda 环境中,我得到同样的结果
OSError: Passed non-file path: s3://mybucket/path/to/myfile
在 pyarrow/parquet.py,第 848 行。
我的问题是:
- 为什么我在 docker 容器中得到的结果与在 Lambda 环境中得到的结果不同?
- 给出 URI 的正确方法是什么?
- 有没有一种公认的方法可以通过 AWS Lambda 读取 S3 中的 Parquet 文件?
Thanks!
AWS有一个项目(AWS 数据管理员),使其具有完整的 Lambda 层支持。
在文档中有一个一步步去做吧。
代码示例:
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://...")
参考
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)