在E-MapReduce中通過Spark創建的Delta表將自動同步到Hive元數據,您可以像使用其他表一樣查詢Delta表。您還可以通過使用Hive創建外表的方式來查詢Delta表。本文為您介紹如何通過Spark創建表和Hive創建外表的方式,在Hive、Presto和Trino中查詢Delta表的數據。
背景信息
Delta表的DDL和DML等操作只能在Spark中執行。您可以通過Hive、Presto和Trino引擎查詢Delta表數據,詳情請參見通過Spark創建表查詢Delta表。
E-MapReduce也支持對已經存在的Delta數據,通過創建Hive外表來查詢數據,詳情請參見創建Hive外表。
使用限制
本文適用于EMR-3.37.0及后續版本,EMR-5.3.0及后續版本以及EMR-4.10.0版本。
通過Spark創建表查詢Delta表
- 進入Spark命令行。
- 使用SSH方式登錄到集群主節點,詳情請參見登錄集群。
- 執行以下命令,進入Spark命令行。
spark-sql
- 在Spark中創建并查詢表數據。
- 執行以下命令,在Spark中創建Delta表。
create table delta_table (id int) using delta location "/tmp/delta_table";
- 執行以下命令,向表中插入數據。
insert into delta_table values 0,1,2,3,4;
- 執行以下命令,查看表數據。
select * from delta_table;
返回包含如下的信息。2 3 4 0 1 Time taken: 1.847 seconds, Fetched 5 row(s)
- 執行以下命令,在Spark中創建Delta表。
查詢Delta表數據。
通過Hive查詢Delta表數據
重要EMR 3.x系列的EMR-3.37.0及后續版本,需要添加參數,您可以在EMR控制臺添加,也可以在運行命令時設置。控制臺添加參數時,在Hive服務的配置頁面的hive-site.xml中,如果使用的是Hive on MR,則添加參數名為hive.input.format,參數值為io.delta.hive.HiveInputFormat的配置項。如果使用的是Hive on Tez,則添加參數名為hive.tez.input.format,參數值為io.delta.hive.HiveInputFormat的配置項。添加操作請參見添加組件參數。
如果需要向Delta表中添加字段(使用ADD COLUMN),為了避免Hive查詢數據異常的情況,建議將新增字段追加到分區字段之前。更多詳細信息,請查看ALTER TABLE。
執行以下命令,進入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表的數據。
通過Presto查詢Delta表數據
執行以下命令,進入Presto命令行。
presto --server master-1-1:8889 --catalog delta --schema default --user hadoop
命令中的參數說明如下:
--server master-1-1:8889
:指定Presto服務器的地址和端口號。--catalog delta
:指定要連接的數據源的名稱。--schema default
:指定要使用的數據庫的名稱。本文示例中,使用的是默認的數據庫。您可以根據需要修改此參數。--user hadoop
:指定用于身份驗證的用戶名。
執行以下命令,在Presto中查看Delta表的數據。
select * from delta_table;
返回如下信息。
id ---- 2 3 4 0 1 (5 rows)
說明查看數據與在Spark中插入的數據一致,說明Presto已經成功訪問了Delta表的數據。
通過Trino查詢Delta表數據
執行以下命令,進入Trino命令行。
trino --server master-1-1:9090 --catalog delta --schema default --user hadoop
命令中的參數說明如下:
--server master-1-1:9090
:指定Trino服務器的地址和端口號。--catalog delta
:指定要連接的數據源的名稱。--schema default
:指定要使用的數據庫的名稱。本文示例中,使用的是默認的數據庫。您可以根據需要修改此參數。--user hadoop
:指定用于身份驗證的用戶名。
執行以下命令,在Trino中查看Delta表的數據。
select * from delta_table;
返回如下信息。
id ---- 2 3 4 0 1 (5 rows)
說明查看數據與在Spark中插入的數據一致,說明Trino已經成功訪問了Delta表的數據。
創建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和Trino中查詢表的方式,與通過Spark創建表訪問查詢Delta表方式相同,詳情請參見步驟3。