E-MapReduce支持Presto读取Delta table,提供DeltaInputFormat和SymlinkTextInputFormat两种读取方式,其中DeltaInputFormat为E-MapReduce独有的方式。本文介绍如何使用Presto读Delta table。

使用DeltaInputFormat读Delta table(仅限EMR)

  1. 使用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';
    说明
    • 如果Delta表是分区表,请执行partitioned by命令在Hive中创建对应的外表。
    • 如果Delta表中存在新增分区,请执行msck repair命令同步分区信息到Hive外表。
  2. 启动Presto客户端读取Delta table。
    SELECT * FROM delta_tbl LIMIT 10;

使用SymlinkTextInputFormat读取Delta table

  1. 使用SparkSQL为目标Delta表创建Symlink文件。
    GENERATE symlink_format_manifest FOR TABLE delta.`/delta_test/order`
    说明 Delta表每次更新后,请执行 GENERATE,确保Presto读取的是Delta表中最新数据。
  2. 使用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/';
  3. 启动Presto客户端读取Delta table。
    SELECT * FROM delta_tbl LIMIT 10;
    说明 目前Presto尚不兼容SparkSQL Using语法建立的Delta表。