E-MapReduce支持Hive读取Delta table,提供DeltaInputFormat和SparkSQL两种读取方式,其中DeltaInputFormat为E-MapReduce独有的方式。本文介绍如何使用Hive读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. 启动Hive客户端读取数据。
    SET hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat;---EMR-3.25.0(不含)之前版本必须设置。
    SELECT * FROM delta_tbl LIMIT 10;

在SparkSQL中查询Hive建立的Delta表

使用DeltaInputFormat读Delta table(仅限EMR)创建的Delta表,由于表中缺少了Spark取表需要的必要信息,导致SparkSQL无法正常访问。如需正常访问,请在Hive建表语句中补全信息。
CREATE EXTERNAL TABLE delta_tbl(id bigint, `date` string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES("path" = "/tmp/delta_table")
STORED AS INPUTFORMAT 'io.delta.hive.DeltaInputFormat'
OUTPUTFORMAT 'io.delta.hive.DeltaOutputFormat'
LOCATION '/tmp/delta_table'
TBLPROPERTIES("spark.sql.sources.provider" = "delta");
说明 目前Hive尚不兼容SparkSQL Using语法建立的Delta表。