E-MapReduce支持Hive读取Delta table,提供DeltaInputFormat和SparkSQL两种读取方式,其中DeltaInputFormat为E-MapReduce独有的方式。本文介绍如何使用Hive读Delta table。
使用DeltaInputFormat读Delta table(仅限EMR)
-
使用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外表。
- 如果Delta表是分区表,请执行
- 启动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表。