【问题标题】:S3 Implementation for org.apache.parquet.io.InputFile?org.apache.parquet.io.InputFile 的 S3 实现?
【发布时间】:2019-11-27 14:37:42
【问题描述】:

我正在尝试编写一个基于 Scala 的 AWS Lambda 来读取基于 S3 的 Snappy 压缩 Parquet 文件。该过程会将它们写回分区的 JSON 文件中。

我一直在尝试使用 org.apache.parquet.hadoop.ParquetFileReader 类来读取文件...不推荐使用的方法似乎是通过 org.apache.parquet.io 的实现.InputFile 接口。有一个用于 Hadoop (HadoopInputFile)...但我找不到用于 S3 的一个。我还尝试了该类的一些已弃用的方法,但也无法让它们与 S3 一起使用。

有解决这个问题的办法吗?

以防万一有人感兴趣...为什么我在 Scala 中这样做?嗯......我想不出另一种方法来做到这一点。 Parquet 的 Python 实现(pyarrow 和 fastparquet)似乎都难以处理基于复杂列表/结构的模式。

另外,我看到了一些基于 AvroParquetReader 的代码 (Read parquet data from AWS s3 bucket),它们可能是一个不同的解决方案,但如果没有已知的架构,我无法让这些代码工作。但也许我在那里遗漏了一些东西。

我真的很想让 ParquetFileReader 类工作,因为它看起来很干净。

欣赏任何想法。

【问题讨论】:

    标签: java amazon-s3 aws-lambda parquet


    【解决方案1】:

    Hadoop 使用自己的文件系统抽象层,该层有一个 s3 实现 (https://hadoop.apache.org/docs/current/hadoop-aws/tools/hadoop-aws/index.html#S3A)。

    设置应如下所示(java,但同样适用于 scala):

    Configuration conf = new Configuration();
    conf.set(Constants.ENDPOINT, "https://s3.eu-central-1.amazonaws.com/");
    conf.set(Constants.AWS_CREDENTIALS_PROVIDER,
        DefaultAWSCredentialsProviderChain.class.getName());
    // maybe additional configuration properties depending on the credential provider
    
    
    URI uri = URI.create("s3a://bucketname/path");
    org.apache.hadoop.fs.Path path = new Path(uri);
    
    ParquetFileReader pfr = ParquetFileReader.open(HadoopInputFile.fromPath(path, conf))
    
    

    【讨论】:

    • 之前不适合我...不记得为什么..会回去再试一次..谢谢。
    • 粘贴堆栈跟踪。如果 Lamba 在 IAM 角色中执行,其中 AWS 访问的凭证以 EC2 VMS 的方式在 169.x 服务器上提供,那么 org.apache.hadoop.fs.s3a.auth.IAMInstanceCredentialsProvider 是信用提供者需要 - 无论如何都在默认的身份验证链上
    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 2023-03-20
    • 1970-01-01
    • 2020-05-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多