问题描述
我想配置 Presto 以查询 AWS S3 中的 ORC 文件。根据文档,必须配置 Hive metastore。这个元存储将收集表的所有模式。由于我有现有的 ORC 文件,是否有任何方法可以使用应嵌入 ORC 文件中的现有表的方案自动填充此元存储?
预先感谢您的帮助!
解决方法
这是完全可能的,但如果 ORC 编写器与 Trino (formerly known as PrestoSQL) 不兼容,则有时可能会失败。这是不太可能的,但应该注意。
第一步是能够使架构正确。您可以通过使用 uber orc-tools.jar 和 meta
命令打印兽人模式来完成此操作。查看更多: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 时)。