全部產品
Search
文件中心

:Delta連接器

更新時間:Jul 01, 2024

EMR Trino提供了獨立的Delta連接器,在E-MapReduce叢集上支援了較為完整的資料湖特性並進行了特性擴充。

背景資訊

Delta Lake是DataBricks公司推出的一種資料湖方案,以資料為中心,圍繞資料流走向推出了一系列功能特性,詳情請參見Delta Lake概述

前提條件

已建立DataLake叢集、Custom叢集,並選擇了Trino服務,或者建立Hadoop叢集,並選擇了Presto服務,詳情請參見建立叢集

使用限制

DataLake叢集、Custom叢集,和EMR-3.39.1及後續版本、EMR-5.5.0及後續版本的Hadoop叢集,支援配置Delta連接器。

基礎使用

修改Delta連接器配置

修改Delta連接器配置,詳情請參見修改內建連接器

連接器預設配置

進入EMR控制台的Trino服務的配置頁面,在服務配置地區,單擊delta.properties頁簽,您可以修改或添加參數,參數值請根據您實際情況修改。

參數

描述

hive.metastore.uri

Hive Metastore使用Thrift協議串連的URI。參數值您可以根據實際情況修改,預設格式為thrift://master-1-1.cluster-24****:9083

hive.config.resources

Hive Metastore使用的資源檔位置。

樣本

Trino無法建立或修改Delta Lake表,可以使用Spark-sql來建立,詳情請參見基礎使用

  1. 產生資料。

    1. 執行以下命令,進入Spark-sql命令列。

      spark-sql
    2. 執行以下命令,建立Delta表。

      CREATE TABLE delta_table (id INT) USING delta;
    3. 執行以下命令,寫入資料。

      INSERT INTO delta_table VALUES 0,1,2,3,4;
  2. 查詢資料。

    1. 進入Trino命令列,詳情請參見通過命令方式訪問Trino

    2. 執行以下命令,查詢表資訊。

      SELECT * FROM delta_table;

      返回資訊如下。

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

高階使用

重要

僅EMR-3.39.1、EMR-5.5.0版本支援下列功能。

Time Travel

Time Travel允許查詢錶的歷史資料。

EMR Trino支援Delta表的Time Travel特性,文法為for xxx as of,其中xxx的值可以為VERSION或TIMESTAMP,分別對應版本號碼和時間戳記兩種Time travel模式。

重要

Trino支援的Time Travel文法和Delta Lake在Spark SQL上的文法相比,多了一個FOR關鍵字。

樣本如下:

  1. 執行以下命令,進入Spark-sql命令列。

    spark-sql
  2. 執行以下命令,覆蓋資料。

    INSERT OVERWRITE TABLE delta_table VALUES 5,6,7,8,9;
  3. 查詢資料。

    1. 進入Trino命令列,詳情請參見通過命令方式訪問Trino

    2. 執行以下命令,查詢表資訊。

      SELECT * FROM delta_table;

      返回資訊如下。

       id
      ----
        5
        6
        7
        8
        9
      (5 rows)
  4. 使用Time Travel查詢歷史資料。

    執行以下命令,按版本號碼查詢資料,直接填寫版本號碼即可。 版本號碼是一個單調遞增的整數。預設第一次INSERT之後版本號碼為1,之後每修改一次版本號碼加1。

    SELECT * FROM delta_table FOR VERSION AS OF 1;

    返回資訊如下。

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

    按時間戳記查詢資料,共支援DATE、TIMESTAMP和TIMESTAMP WITH TIME ZONE三種類型的時間戳記。

    • DATE類型:查詢日期所對應的UTC時間00:00:00的資料。

    • TIMESTAMP類型:查詢指定時間戳記對應的UTC的資料。

      例如,使用TIMESTAMP類型查詢北京時間(+08:00)2022年2月15日20點整的資料,則代碼如下。

      SELECT * FROM delta_table FOR TIMESTAMP AS OF TIMESTAMP '2022-02-15 12:00:00';
      說明

      其中,第一個TIMESTAMP說明使用的是時間戳記進行Time Travel查詢(非版本號碼),第二個TIMESTAMP則說明時間戳記是TIMESTAMP類型(非DATE類型)。

      返回資訊如下。

       id
      ----
        2
        0
        3
        4
        1
      (5 rows)
    • TIMESTAMP WITH TIME ZONE類型:無法直接讀取資料,需要進行格式轉換。

      例如,查詢北京時間(+08:00)2022年2月15日20點的資料。程式碼範例如下。

      SELECT * FROM delta_table FOR TIMESTAMP AS OF CAST('2022-02-15 20:00:00 +0800' AS TIMESTAMP WITH TIME ZONE);

Z-Order

Trino基於Z-Order最佳化了Delta表查詢。目前支援Parquet自身的最佳化和Data Skipping的最佳化。執行最佳化後,Delta會按檔案粒度統計各個欄位的最大和最小值,該統計資訊用於直接過濾資料檔案。Trino的Delta連接器可以讀取到這些統計資訊。

對於使用OPTIMIZE和ZORDER BY命令最佳化過的Delta表,在Z-Order列設定合適時,Trino的查詢速度最大能夠提升數十倍。

Trino支援Z-order的資料類型有Int、Long、Double、Float、Binary、Boolean、String和Array。

Trino支援Z-Order Data Skipping的謂詞有=<<=>>=

說明

Trino暫不支援like和in等謂詞,但由於Z-order的局部排序能力,這些謂詞在Z-order最佳化後同樣可以提升查詢速度。

例如,表conn_zorder,共含有src_ip、src_port、dst_ip和dst_port四列。

先在Spark中執行最佳化,命令如下所示。

OPTIMIZE conn_zorder ZORDER BY (src_ip, src_port, dst_ip, dst_port);
重要

括弧中的順序即為Z-Order的順序。

OPTIMIZE操作會根據資料量大小耗費一定時間。最佳化完成後,執行合格查詢均會提升效能。

  • 查詢一部分Z-Order最佳化的列能提升效能,命令如下所示。

    SELECT COUNT(*) FROM conn_zorder WHERE src_ip > '64.';
  • 按Z-Order的最佳化順序執行查詢,速度提升非常大,命令如下所示。

    SELECT COUNT(*) FROM conn_zorder WHERE src_ip >= '64.' AND dst_ip < '192.' AND src_port < 1000 AND dst_port > 50000;