E-MapReduce支持Presto读取Delta table,支持的方式有DeltaInputFormat和SymlinkTextInputFormat两种,其中DeltaInputFormat为E-MapReduce独有的方式。

使用DeltaInputFormat(仅限EMR)

使用DeltaInputFormat读取Delta table遵循以下步骤:

  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';
    说明
    • Presto不支持建立Hive外表,因此建外表的动作需要在Hive中完成。
    • 如果Delta表是分区表,则Hive中创建对应的外表(partitioned by)。当Delta表中有新增分区时,则需要执行msck repair命令,来同步分区信息到Hive外表。
  2. 启动Presto客户端读取。
    SELECT * FROM delta_tbl LIMIT 10;

使用SymlinkTextInputFormat

使用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客户端读取。
    SELECT * FROM delta_tbl LIMIT 10;

常见问题

Q:Presto是否支持读取SparkSQL建立的Delta表?

A:目前Presto尚不兼容SparkSQL Using语法建立的Delta表。