python - 使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件

标签 python amazon-s3 aws-lambda parquet pyarrow

我正在尝试使用 AWS Lambda 在 S3 中加载、处理和写入 Parquet 文件。我的测试/部署过程是:

似乎有两种可能的方法,都在 docker 容器本地工作:

  1. 带有 s3fs 的 fastparquet:不幸的是,包的解压缩大小大于 256MB,因此我无法用它更新 Lambda 代码。
  2. 带有 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

我的问题是:

  • 为什么我在 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://...")

Reference

关于python - 使用 AWS Lambda (Python 3) 读取存储在 S3 中的 Parquet 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984322/

相关文章:

python - 如何选择策略来减少过拟合?

amazon-web-services - AWS API 网关 : Execution failed due to configuration error: No match for output mapping and no default output mapping configured

amazon-web-services - 使用 Go 设置 AWS Lambda,为什么我总是用这个简单的函数得到 "Internal server error"?

amazon-s3 - 尝试在 AWS Lambda 函数的无服务器框架中创建多个 s3 存储桶时,Yaml 文件中出现错误

java - 使用 Java NIO 监视服务监视 http 资源

python-3.x - 使用 chalice 部署时 Lambda 超时配置重置为 1

python - 从线程发出时,Flask Socket.io 不起作用

python - 如何在 ipython 笔记本中显示 PIL 图像

python - Elastic Beanstalk SciPy.* 无提示地失败

android - AWS S3 传输实用程序上次修改日期