在E-MapReduce中通过Spark创建的Delta表将自动同步到Hive元数据,您可以像使用其它表一样查询Delta表。您也可以通过Hive创建外表来查询Delta表。本文为您介绍如何通过Spark创建表和Hive创建外表的方式,在Hive、Presto和Impala访问Delta表的数据。
背景信息
- Delta表的DDL和DML等操作只能在Spark中执行。您可以通过Hive、Presto和Impala引擎查询Delta表数据,详情请参见通过Spark创建表访问查询Delta表。
- E-MapReduce也支持对已经存在的Delta数据,通过创建Hive外表来查询数据,详情请参见创建Hive外表。
通过Spark创建表访问查询Delta表
访问Delta表数据。
- 通过Hive访问Delta表数据
注意 EMR 3.x系列的EMR-3.37.0及后续版本,您可以在EMR控制台添加自定义参数,也可以在运行命令时设置参数。控制台添加参数时,在Hive服务的配置页面,如果使用的是Hive on MR,则添加参数名为hive.input.format,参数值为io.delta.hive.HiveInputFormat的配置项,如果使用的是Hive on Tez,则添加参数名为hive.tez.input.format,参数值为io.delta.hive.HiveInputFormat的配置项。添加操作请参见添加组件参数。
- 执行以下命令,进入Hive命令行。
hive
- 执行以下命令,在Hive中查看Delta表的数据。
select * from delta_table;
返回如下信息。2 3 4 0 1 Time taken: 2.937 seconds, Fetched: 5 row(s)
说明 查看数据与在Spark中插入的数据一致,说明Hive已经成功访问了Delta表的数据。
- 执行以下命令,进入Hive命令行。
- 通过Presto访问Delta表数据
- 执行以下命令,进入Presto命令行。
presto --server emr-header-1:9090 --catalog hive --schema default
- 执行以下命令,在Presto中查看Delta表的数据。
select * from delta_table;
返回如下信息。id ---- 2 3 4 0 1 (5 rows)
说明 查看数据与在Spark中插入的数据一致,说明Presto已经成功访问了Delta表的数据。
- 执行以下命令,进入Presto命令行。
- 通过Impala访问Delta表数据
- 执行以下命令,进入Impala命令行。
impala-shell
- 执行以下命令,在Impala中查看Delta表的数据。
select * from delta_table;
返回如下信息。+----+ | id | +----+ | 2 | | 3 | | 4 | | 0 | | 1 | +----+
说明 查看数据与在Spark中插入的数据一致,说明Impala已经成功访问了Delta表的数据。
- 执行以下命令,进入Impala命令行。
创建Hive外表
E-MapReduce也支持对已存在的Delta数据创建Hive外表来查询。示例如下。
CREATE EXTERNAL TABLE delta_tbl (name string, age int, city string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES("path" = "/path/to/delta")
STORED AS INPUTFORMAT 'io.delta.hive.DeltaInputFormat'
OUTPUTFORMAT 'io.delta.hive.DeltaOutputFormat'
LOCATION '/path/to/delta'
TBLPROPERTIES("spark.sql.sources.provider" = "delta");
如果您创建的集群是EMR 3.x系列的EMR-3.37.0及后续版本,您也可以通过Hive StorageHandler的方式创建外表。示例如下。
CREATE EXTERNAL TABLE delta_tbl123 (name string, age int, city string)
STORED BY 'io.delta.hive.DeltaStorageHandler'
WITH SERDEPROPERTIES("path" = "/path/to/delta")
LOCATION '/path/to/delta'
TBLPROPERTIES("spark.sql.sources.provider" = "delta");
说明 建表语句中
SERDEPROPERTIES
设置path
,以及TBLPROPERTIES
中设置spark.sql.sources.provider
是为了兼容后续通过SparkSQL的方式查询。通过该方式创建Delta外表后,在Hive、Presto和Impala查询表的方式,与通过Spark创建表访问查询Delta表方式相同,详情请参见步骤3。