【问题标题】:How to read parquet data with partitions from Aws S3 using presto?如何使用 presto 从 Aws S3 中读取带有分区的镶木地板数据?
【发布时间】:2019-12-12 21:11:58
【问题描述】:

我有数据以 带有分区的镶木地板文件的形式存储在 S3 中。我正在尝试使用 presto 读取这些数据。如果我给出带有分区的镶木地板文件的完整位置,我就能够读取数据。以下是从“a 部分”读取数据的查询:

presto> create table IF NOT EXISTS default.sample(name varchar(255), age varchar(255), section varchar(255)) WITH (external_location = 's3://bucket/presto/section=a', format = 'PARQUET');

但我的数据被划分为不同的部分,即 s3://bucket/presto 文件夹包含多个文件夹,如“section=a”、“section=b”等。

我正在尝试使用以下分区读取数据:

presto> create table IF NOT EXISTS default.sample(name varchar(255), age varchar(255), section varchar(255)) WITH (partitioned_by = ARRAY['section'], external_location = 's3://bucket/presto', format = 'PARQUET');

正在创建表,但是当我尝试选择数据时,表为空。

我是 Presto 的新手,请帮忙。

谢谢

【问题讨论】:

    标签: amazon-s3 partitioning parquet presto


    【解决方案1】:

    您正确地创建了表格:

    create table IF NOT EXISTS default.sample(name varchar(255), age varchar(255), section varchar(255))
    WITH (partitioned_by = ARRAY['section'], external_location = 's3://bucket/presto', format = 'PARQUET');
    

    但是,在“Hive 表格式”中,不会自动发现分区。相反,它们需要显式声明。这有一些原因:

    • 分区的显式声明允许您在完成编写后“以原子方式”发布分区
    • section=a,section=b只是约定,分区位置可能不同。实际上,分区可以位于其他一些 S3 存储桶或不同的存储中

    要在像您这样的情况下自动发现分区,您可以使用 Presto 附带的system.sync_partition_metadata procedure

    【讨论】:

    • sync_partition_metadata 过程是否用于将分区添加到 S3 中已存在这些分区的新表的 Hive 元存储?还是需要直接将它们添加到元存储中?询问该过程似乎对我的系统没有影响(v324 和 Minio)。
    • 是的,如果分区存在于文件系统中,这应该在 Metastore 中注册分区。 @kermatt 故障排除的好地方是 Presto Community Slack 上的 #troubleshooting 频道 prestosql.io/slack.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2019-12-07
    • 2017-12-18
    • 2019-09-30
    • 2021-08-26
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多