在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。