E-MapReduce支持Presto读取Delta table,支持的方式有DeltaInputFormat和SymlinkTextInputFormat两种,其中DeltaInputFormat为E-MapReduce独有的方式。
使用DeltaInputFormat(仅限EMR)
使用DeltaInputFormat读取Delta table遵循以下步骤:
-
使用Hive客户端,在Hive Metastore中创建一张指向Delta目录的外表。
CREATE EXTERNAL TABLE delta_tbl(id bigint, `date` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'io.delta.hive.DeltaInputFormat' OUTPUTFORMAT 'io.delta.hive.DeltaOutputFormat' LOCATION '/tmp/delta_table';
说明- Presto不支持建立Hive外表,因此建外表的动作需要在Hive中完成。
- 如果Delta表是分区表,则Hive中创建对应的外表(partitioned by)。当Delta表中有新增分区时,则需要执行msck repair命令,来同步分区信息到Hive外表。
- 启动Presto客户端读取。
SELECT * FROM delta_tbl LIMIT 10;
使用SymlinkTextInputFormat
使用SymlinkTextInputFormat读取Delta table遵循以下步骤:
-
使用SparkSQL为目标Delta表创建Symlink文件。
GENERATE symlink_format_manifest FOR TABLE delta.`/delta_test/order`
说明 如果Delta表有更新,每次需要GENERATE一下,以保证Presto读取的是Delta表中最新的数据。 - 使用Hive客户端在Hive Metastore中创建一张指向Delta目录的外表。
CREATE EXTERNAL TABLE delta_tbl(id bigint, `date` string) ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe' STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.SymlinkTextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION '/tmp/delta_table/_symlink_format_manifest/';
- 启动Presto客户端读取。
SELECT * FROM delta_tbl LIMIT 10;
常见问题
Q:Presto是否支持读取SparkSQL建立的Delta表?
A:目前Presto尚不兼容SparkSQL Using语法建立的Delta表。