在 S3 中的现有 ORC 文件上使用 Presto

问题描述

我想配置 Presto 以查询 AWS S3 中的 ORC 文件。根据文档,必须配置 Hive metastore。这个元存储将收集表的所有模式。由于我有现有的 ORC 文件,是否有任何方法可以使用应嵌入 ORC 文件中的现有表的方案自动填充此元存储?

预先感谢您的帮助!

解决方法

这是完全可能的,但如果 ORC 编写器与 Trino (formerly known as PrestoSQL) 不兼容,则有时可能会失败。这是不太可能的,但应该注意。

第一步是能够使架构正确。您可以通过使用 uber orc-tools.jarmeta 命令打印兽人模式来完成此操作。查看更多:https://orc.apache.org/docs/java-tools.html

java -jar orc-tools-1.6.7-uber.jar meta bucket_00001.orc
Processing data file bucket_00001.orc [length: 78511]
Structure for bucket_00001.orc
File Version: 0.12 with PRESTO_ORIGINAL
Rows: 1500
Compression: ZLIB
Compression size: 262144
Calendar: Julian/Gregorian
Type: struct<custkey:bigint,name:string,address:string,nationkey:bigint,phone:string,acctbal:double,mktsegment:string,comment:string>

您需要采用输出中的 Type 结构。您还需要确保架构在所有 ORC 文件之间保持一致。

下一步是将 Type 结构体转换为 CREATE TABLE 语句,如下所示:

CREATE TABLE hive.default.customer (
   custkey BIGINT,name VARCHAR,address VARCHAR,nationkey BIGINT,phone VARCHAR,acctbal DOUBLE,mktsegment VARCHAR,comment VARCHAR
);

创建表后,您应该就可以开始查询了,除非您的表中有分区。如果是这种情况,您将需要同步 Hive Metastore(或可能是文件 Metastore)以将现有分区位置添加到 Metastore。

假设您在上面的 nationkey 列上有一个分区,您的 CREATE TABLE 语句将如下所示:

CREATE TABLE hive.default.customer (
   custkey BIGINT,comment VARCHAR,nationkey BIGINT
) WITH (
  partitioned_by = ARRAY['nationkey']
);

然后您会想要同步哪些可以通过 system.sync_partition_metadata procedure 完成。

这看起来像这样:

CALL system.sync_partition_metadata('default','customer','ADD');

还有 a demo of doing this in the Trino Community Broadcast(当 Trino 还被称为 PrestoSQL 时)。