E-MapReduce支持Hive读取Delta table。

使用DeltaInputFormat(仅限 EMR)

使用EMR-Hive读取Delta table遵循以下步骤:

  1. 在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表是分区表,则Hive中创建对应的外表(partitioned by)。当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(仅限 EMR)中创建的Delta表,SparkSQL不能正常访问,原因在于表中缺少了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'
TBLPROPERTEIS("spark.sql.sources.provider" = "delta");
说明 需重点关注下建表语句中的WITH SERDEPROPERTIESTBLPROPERTEIS子句。

常见问题

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

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