全部產品
Search
文件中心

E-MapReduce:查詢Delta表資料

更新時間:Jul 01, 2024

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

  1. 進入Spark命令列。
    1. 使用SSH方式登入到叢集主節點,詳情請參見登入叢集
    2. 執行以下命令,進入Spark命令列。
      spark-sql
  2. 在Spark中建立並查詢表資料。
    1. 執行以下命令,在Spark中建立Delta表。
      create table delta_table (id int) using delta location "/tmp/delta_table";
    2. 執行以下命令,向表中插入資料。
      insert into delta_table values 0,1,2,3,4;
    3. 執行以下命令,查看錶資料。
      select * from delta_table;
      返回包含如下的資訊。
      2
      3
      4
      0
      1
      Time taken: 1.847 seconds, Fetched 5 row(s)
  3. 查詢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

    1. 執行以下命令,進入Hive命令列。

      hive
    2. 執行以下命令,在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表資料

    1. 執行以下命令,進入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:指定用於身分識別驗證的使用者名稱。

    2. 執行以下命令,在Presto中查看Delta表的資料。

      select * from delta_table;

      返回如下資訊。

       id
      ----
        2
        3
        4
        0
        1
      (5 rows)
      說明

      查看資料與在Spark中插入的資料一致,說明Presto已經成功訪問了Delta表的資料。

    通過Trino查詢Delta表資料

    1. 執行以下命令,進入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:指定用於身分識別驗證的使用者名稱。

    2. 執行以下命令,在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