我正在尝试使用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容器中本地都有效:
- 使用s3fs的fastparquet: 不幸的是,打包后的包的大小大于256MB,因此我无法使用它更新Lambda代码。
使用s3fs的pyarrow:我遵循了https://github.com/apache/arrow/pull/916,当用Lambda函数执行时,我会得到以下结果:
- 如果我在URI前缀中加上S3或S3N(如代码示例中):在Lambda环境中,会出现
pyarrow/parquet.py
中的OSError: Passed non-file path: s3://mybucket/path/to/myfile
错误。本地运行时,在pyarrow/parquet.py
的第714行会出现IndexError: list index out of range
。
- 如果我在URI前缀中加上S3或S3N(如代码示例中):在Lambda环境中,会出现
- 如果我不在URI前加S3或S3N:它在本地工作(我可以读取parquet数据),但在Lambda环境中,我会在pyarrow/parquet.py的848行收到相同的
OSError: Passed non-file path: s3://mybucket/path/to/myfile
。 - 为什么Docker容器中的结果与Lambda环境中的结果不同?
- 给URI的正确方式是什么?
- 是否有一种接受的方法可以通过AWS Lambda读取S3中的Parquet文件?
我的问题是:
谢谢!