Iceberg 連接器

概觀

Iceberg 連接器允許查詢儲存在 Iceberg 表格中的資料。

中繼資料儲存區

Iceberg 表格將大部分的中繼資料儲存在中繼資料檔案中,以及檔案系統上的資料,但它仍然需要一個中心位置來尋找表格目前中繼資料指標的目前位置。這個中心位置稱為 Iceberg 目錄。Presto Iceberg 連接器支援不同類型的 Iceberg 目錄: HIVENESSIERESTHADOOP

若要設定 Iceberg 連接器,請建立目錄屬性檔案 etc/catalog/iceberg.properties。若要定義目錄類型,iceberg.catalog.type 屬性是必要的,以及以下內容,屬性值會被取代如下

Hive 中繼資料儲存區目錄

Iceberg 連接器支援與 Hive 連接器相同的 HMS 設定。

connector.name=iceberg
hive.metastore.uri=hostname:port
iceberg.catalog.type=hive

Glue 目錄

Iceberg 連接器支援與 Hive 連接器相同的 Glue 設定。

connector.name=iceberg
hive.metastore=glue
iceberg.catalog.type=hive

當使用設定了 Hive 或 Glue 目錄的 Iceberg 連接器時,可以使用其他設定。

屬性名稱

描述

預設值

hive.metastore.uri

使用 Thrift 通訊協定連線的 Hive 中繼資料儲存區的 URI。如果提供多個 URI,則預設會使用第一個 URI,而其餘的 URI 則為後援中繼資料儲存區。

範例:thrift://192.0.2.3:9083thrift://192.0.2.3:9083,thrift://192.0.2.4:9083

如果 iceberg.catalog.typehivehive.metastorethrift,則此屬性為必要。

iceberg.hive-statistics-merge-strategy

從 Hive 中繼資料儲存區使用統計資料來覆寫 Iceberg 表格統計資料的逗號分隔清單。可用值為 NUMBER_OF_DISTINCT_VALUESTOTAL_SIZE_IN_BYTES

注意:僅當 Iceberg 連接器設定了 Hive 時才有效。

iceberg.hive.table-refresh.backoff-min-sleep-time

在重新整理表格中繼資料時,重試之間睡眠的最短時間。

100 毫秒

iceberg.hive.table-refresh.backoff-max-sleep-time

在重新整理表格中繼資料時,重試之間睡眠的最長時間。

5 秒

iceberg.hive.table-refresh.max-retry-time

在失敗表格中繼資料重新整理作業之前,在所有重試中花費的最長時間。

1 分鐘

iceberg.hive.table-refresh.retries

在使用 Hive 中繼資料儲存區重新整理表格中繼資料時,發生錯誤後重試的次數。

20

iceberg.hive.table-refresh.backoff-scale-factor

用於縮放重試之間後續等待時間的倍數。

4.0

Nessie 目錄

若要使用 Nessie 目錄,請將目錄類型設定為 iceberg.catalog.type=nessie

connector.name=iceberg
iceberg.catalog.type=nessie
iceberg.catalog.warehouse=/tmp
iceberg.nessie.uri=https://127.0.0.1:19120/api/v1

Nessie 目錄的其他支援屬性

屬性名稱

描述

iceberg.nessie.ref

用於 Nessie 的分支/標籤,預設為 main

iceberg.nessie.uri

Nessie API 端點 URI(必要)。範例:https://127.0.0.1:19120/api/v1

iceberg.nessie.auth.type

要使用的驗證類型。可用值為 BASICBEARER。範例:BEARER

注意: Nessie BASIC 驗證類型已過時,這將在即將發布的版本中移除

iceberg.nessie.auth.basic.username

搭配 BASIC 驗證使用的使用者名稱。範例:test_user

iceberg.nessie.auth.basic.password

搭配 BASIC 驗證使用的密碼。範例:my$ecretPass

iceberg.nessie.auth.bearer.token

用於 BEARER 驗證的權杖。範例:SXVLUXUhIExFQ0tFUiEK

iceberg.nessie.read-timeout-ms

向 Nessie 伺服器發出請求的讀取逾時時間(毫秒)。範例:5000

iceberg.nessie.connect-timeout-ms

向 Nessie 伺服器發出連線請求的連線逾時時間(毫秒)。範例:10000

iceberg.nessie.compression-enabled

設定是否啟用對 Nessie 伺服器請求的壓縮,預設值為 true

iceberg.nessie.client-builder-impl

要使用的自訂 ClientBuilder 實作類別設定。

使用 Docker 設定 Nessie

若要使用 Docker 映像在本地設定 Nessie 執行個體,請參閱設定 Nessie。一旦 Docker 執行個體啟動並執行,您應該會看到類似以下範例的記錄

2023-09-05 13:11:37,905 INFO  [io.quarkus] (main) nessie-quarkus 0.69.0 on JVM (powered by Quarkus 3.2.4.Final) started in 1.921s. Listening on: http://0.0.0.0:19120
2023-09-05 13:11:37,906 INFO  [io.quarkus] (main) Profile prod activated.
2023-09-05 13:11:37,906 INFO  [io.quarkus] (main) Installed features: [agroal, amazon-dynamodb, cassandra-client, cdi, google-cloud-bigtable, hibernate-validator, jdbc-postgresql, logging-sentry, micrometer, mongodb-client, narayana-jta, oidc, opentelemetry, reactive-routes, resteasy, resteasy-jackson, security, security-properties-file, smallrye-context-propagation, smallrye-health, smallrye-openapi, swagger-ui, vertx]

如果與 Nessie 的 OpenTelemetry 收集器相關的記錄訊息與以下範例類似,您可以使用組態選項 quarkus.otel.sdk.disabled=true 來停用 OpenTelemetry。

2023-08-27 11:10:02,492 INFO  [io.qua.htt.access-log] (executor-thread-1) 172.17.0.1 - - [27/Aug/2023:11:10:02 +0000] "GET /api/v1/config HTTP/1.1" 200 62
2023-08-27 11:10:05,007 SEVERE [io.ope.exp.int.grp.OkHttpGrpcExporter] (OkHttp https://127.0.0.1:4317/...) Failed to export spans. The request could not be executed. Full error message: Failed to connect to localhost/127.0.0.1:4317

例如,使用以下命令啟動 Docker 映像:docker run -p 19120:19120 -e QUARKUS_OTEL_SDK_DISABLED=true ghcr.io/projectnessie/nessie

有關此組態選項和其他相關選項的詳細資訊,請參閱OpenTelemetry 組態參考

有關疑難排解 OpenTelemetry 追蹤的詳細資訊,請參閱疑難排解追蹤

如果顯示類似以下範例的錯誤,這可能是因為您正在與 http 伺服器互動,而不是 https 伺服器。您需要將 iceberg.nessie.uri 設定為 https://127.0.0.1:19120/api/v1

Caused by: javax.net.ssl.SSLException: Unsupported or unrecognized SSL message
    at sun.security.ssl.SSLSocketInputRecord.handleUnknownRecord(SSLSocketInputRecord.java:448)
    at sun.security.ssl.SSLSocketInputRecord.decode(SSLSocketInputRecord.java:174)
    at sun.security.ssl.SSLTransport.decode(SSLTransport.java:111)
    at sun.security.ssl.SSLSocketImpl.decode(SSLSocketImpl.java:1320)
    at sun.security.ssl.SSLSocketImpl.readHandshakeRecord(SSLSocketImpl.java:1233)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:417)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:389)
    at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:558)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:201)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:167)
    at org.projectnessie.client.http.impl.jdk8.UrlConnectionRequest.executeRequest(UrlConnectionRequest.java:71)
    ... 42 more

REST 目錄

若要使用 REST 目錄,請將目錄類型設定為 iceberg.catalog.type=rest。最少的組態包含

connector.name=iceberg
iceberg.catalog.type=rest
iceberg.rest.uri=https://127.0.0.1:8181

REST 目錄的其他支援屬性

屬性名稱

描述

iceberg.rest.uri

REST API 端點 URI(必要)。範例:https://127.0.0.1:8181

iceberg.rest.auth.type

要使用的驗證類型。可用值為 NONEOAUTH2(預設值:NONE)。OAUTH2 需要憑證或權杖。

iceberg.rest.auth.oauth2.credential

用於 OAUTH2 驗證的憑證。範例:key:secret

iceberg.rest.auth.oauth2.token

用於 OAUTH2 驗證的 Bearer 權杖。範例:SXVLUXUhIExFQ0tFUiEK

iceberg.rest.session.type

與 REST 目錄通訊時要使用的會話類型。可用值為 NONEUSER(預設值:NONE)。

iceberg.catalog.warehouse

Iceberg 資料表的目錄倉庫根路徑(選用)。範例:s3://warehouse/

Hadoop 目錄

若要使用 Hadoop 目錄,請將目錄類型設定為 iceberg.catalog.type=hadoop。最少的組態包含

connector.name=iceberg
iceberg.catalog.type=hadoop
iceberg.catalog.warehouse=hdfs://hostname:port

Hadoop 目錄組態屬性

屬性名稱

描述

預設值

iceberg.catalog.warehouse

Iceberg 資料表的目錄倉庫根路徑。

範例:hdfs://nn:8020/warehouse/path 如果 iceberg.catalog.typehadoop,則此屬性為必要項。

iceberg.catalog.cached-catalog-num

要快取的 Iceberg 目錄數量。如果 iceberg.catalog.typehadoop,則此屬性為必要項。否則,將會忽略它。

10

組態屬性

注意

Iceberg 連接器支援 Amazon S3 作為 Hive 連接器的組態選項。

以下組態屬性適用於所有目錄類型

屬性名稱

描述

預設值

iceberg.catalog.type

Iceberg 資料表的目錄類型。可用值為 HIVEHADOOPNESSIEREST

HIVE

iceberg.hadoop.config.resources

Hadoop 組態資源的路徑。

範例:/etc/hadoop/conf/core-site.xml. 如果 iceberg.catalog.type 為 hadoop,則此屬性為必要項。否則,將會忽略它。

iceberg.file-format

Iceberg 資料表的儲存檔案格式。可用值為 PARQUETORC

PARQUET

iceberg.compression-codec

寫入檔案時要使用的壓縮編碼解碼器。可用值為 NONESNAPPYGZIPLZ4ZSTD

GZIP

iceberg.max-partitions-per-writer

每個寫入器處理的最大分割數。

100

iceberg.minimum-assigned-split-weight

範圍 (0, 1] 中的小數值用作分配給每個分割的權重的最小值。較低的值可能會提高具有小檔案的資料表的效能。較高的值可能會提高具有高度傾斜的彙總或聯結查詢的效能。

0.05

iceberg.enable-merge-on-read-mode

啟用讀取使用合併讀取進行更新的基礎資料表。

true

iceberg.delete-as-join-rewrite-enabled

啟用後,會將相等刪除列篩選套用為與相等刪除檔案資料的聯結。

true

iceberg.enable-parquet-dereference-pushdown

啟用 parquet 取消參考下推。

true

iceberg.statistic-snapshot-record-difference-weight

在選取統計資料時,總記錄計數差異在計算最接近快照時的重要性。值 1 表示單一記錄相當於 1 毫秒的時間差異。

iceberg.pushdown-filter-enabled

實驗性:啟用 Iceberg 的篩選下推。這僅在原生工作者中支援。

false

iceberg.rows-for-metadata-optimization-threshold

Iceberg 資料表中的最大分割數,以允許使用中繼資料最佳化該資料表的查詢。如果 Iceberg 資料表的分割數超過此閾值,則會跳過中繼資料最佳化。

設定為 0 以停用中繼資料最佳化。

1000

iceberg.split-manager-threads

用於產生 Iceberg 分割的執行緒數。

可用 處理器 數量

iceberg.metadata-previous-versions-max

要保留在目前中繼資料記錄中的舊中繼資料檔案的最大數量。

100

iceberg.metadata-delete-after-commit

設定為 true 以在每次提交後刪除最舊的中繼資料檔案。

false

資料表屬性

資料表屬性設定基礎資料表的中繼資料。這是 CREATE TABLE/CREATE TABLE AS 陳述式的關鍵。資料表屬性會使用 WITH 子句傳遞至連接器

CREATE TABLE tablename
WITH (
    property_name = property_value,
    ...
)

以下資料表屬性可用,這些屬性是 Presto Iceberg 連接器所特有的

屬性名稱

描述

預設值

format

選擇性地指定資料表資料檔案的格式,可以是 PARQUETORC

PARQUET

partitioning

選擇性地指定資料表分割。如果資料表依欄 c1c2 分割,則分割屬性為 partitioning = ARRAY['c1', 'c2']

location

選擇性地指定資料表的檔案系統位置 URI。

format_version

選擇性地指定要用於新資料表的 Iceberg 規格的格式版本,可以是 12

2

commit_retries

決定在發生並行更新插入請求時,在失敗之前提交中繼資料的嘗試次數。

4

delete_mode

選擇性地指定要用於新資料表的 Iceberg 規格的寫入刪除模式,可以是 copy-on-writemerge-on-read

merge-on-read

metadata_previous_versions_max

選擇性地指定要保留在目前中繼資料記錄中的舊中繼資料檔案的最大數量。

100

metadata_delete_after_commit

設定為 true 以在每次提交後刪除最舊的中繼資料檔案。

false

以下資料表定義指定格式 ORC,依欄 c1c2 分割,以及檔案系統位置為 s3://test_bucket/test_schema/test_table

CREATE TABLE test_table (
    c1 bigint,
    c2 varchar,
    c3 double
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['c1', 'c2'],
    location = 's3://test_bucket/test_schema/test_table')
)

會話屬性

會話屬性設定在給定會話中執行的查詢的行為變更。

屬性名稱

描述

iceberg.delete_as_join_rewrite_enabled

覆寫目前連線中連接器屬性 iceberg.delete-as-join-rewrite-enabled 的行為。

iceberg.hive_statistics_merge_strategy

覆寫目前連線中連接器屬性 iceberg.hive-statistics-merge-strategy 的行為。

iceberg.rows_for_metadata_optimization_threshold

覆寫目前連線中連接器屬性 iceberg.rows-for-metadata-optimization-threshold 的行為。

快取支援

清單檔案快取

自 Iceberg 1.1.0 版本起,Apache Iceberg 提供一種機制,可將 Iceberg 清單檔案的內容快取至記憶體中。此功能有助於減少重複從遠端儲存讀取小型 Iceberg 清單檔案。

注意

目前,Presto Iceberg 連接器中的 Hadoop 和 Nessie 目錄支援清單檔案快取。

以下組態屬性可用

屬性名稱

描述

預設值

iceberg.io.manifest.cache-enabled

啟用或停用清單快取功能。只有當 iceberg.catalog.typehadoopnessie 時,此功能才可用。

false

iceberg.io-impl

要在目錄中使用的自訂 FileIO 實作。必須設定此選項才能啟用清單快取。

org.apache.iceberg.hadoop.HadoopFileIO

iceberg.io.manifest.cache.max-total-bytes

快取大小上限(以位元組為單位)。

104857600

iceberg.io.manifest.cache.expiration-interval-ms

項目在清單快取中保留的最長持續時間(以毫秒為單位)。

60000

iceberg.io.manifest.cache.max-content-length

要考慮快取的清單檔案最大長度(以位元組為單位)。長度超過此大小的清單檔案將不會被快取。

8388608

Alluxio 資料快取

Presto 工作節點會在讀取時,將遠端儲存資料以原始形式(已壓縮且可能已加密)快取至本機 SSD。

需要在 Iceberg 目錄檔案 (catalog/iceberg.properties) 中設定以下組態屬性

cache.enabled=true
cache.base-directory=file:///mnt/flash/data
cache.type=ALLUXIO
cache.alluxio.max-cache-size=1600GB
hive.node-selection-strategy=SOFT_AFFINITY

用於取得指標並驗證快取使用情況的 JMX 查詢

SELECT * FROM jmx.current."com.facebook.alluxio:name=client.cachehitrate,type=gauges";

SELECT * FROM jmx.current."com.facebook.alluxio:name=client.cachebytesreadcache,type=meters";

SHOW TABLES FROM jmx.current like '%alluxio%';

在分葉工作節點記憶體中快取開啟的檔案描述元和 stripe 或檔案頁尾資訊。這些資料片段在讀取檔案時最常被存取。

需要在 Iceberg 目錄檔案 (catalog/iceberg.properties) 中設定以下組態屬性

# scheduling
hive.node-selection-strategy=SOFT_AFFINITY

# orc
iceberg.orc.file-tail-cache-enabled=true
iceberg.orc.file-tail-cache-size=100MB
iceberg.orc.file-tail-cache-ttl-since-last-access=6h
iceberg.orc.stripe-metadata-cache-enabled=true
iceberg.orc.stripe-footer-cache-size=100MB
iceberg.orc.stripe-footer-cache-ttl-since-last-access=6h
iceberg.orc.stripe-stream-cache-size=300MB
iceberg.orc.stripe-stream-cache-ttl-since-last-access=6h

# parquet
iceberg.parquet.metadata-cache-enabled=true
iceberg.parquet.metadata-cache-size=100MB
iceberg.parquet.metadata-cache-ttl-since-last-access=6h

用於取得指標並驗證快取使用情況的 JMX 查詢

SELECT * FROM jmx.current."com.facebook.presto.hive:name=iceberg_parquetmetadata,type=cachestatsmbean";

中繼資料儲存快取

中繼資料儲存快取僅快取結構描述、表格和表格統計資料。 tableCache 中快取的表格物件僅用於讀取表格中繼資料位置和表格屬性,而其餘表格中繼資料則從檔案系統/物件儲存中繼資料位置擷取。

注意

中繼資料儲存快取僅適用於 Presto Iceberg 連接器中的 Hive 目錄。

hive.metastore-cache-ttl=2d
hive.metastore-refresh-interval=3d
hive.metastore-cache-maximum-size=10000000

額外隱藏的中繼資料欄

Iceberg 連接器會公開額外的隱藏中繼資料欄。您可以將這些欄包含在 SELECT 陳述式中,以在 SQL 查詢中查詢它們。

$path

  • $path:此列的檔案完整檔案系統路徑名稱

SELECT "$path", regionkey FROM "ctas_nation";
        $path                    |  regionkey
---------------------------------+-----------
 /full/path/to/file/file.parquet | 2

$data_sequence_number

  • $data_sequence_number:新增此列的 Iceberg 資料序列號碼

SELECT "$data_sequence_number", regionkey FROM "ctas_nation";
        $data_sequence_number     |  regionkey
----------------------------------+------------
             2                    | 3

額外隱藏的中繼資料表格

Iceberg 連接器會公開額外的隱藏中繼資料表格。您可以將這些表格名稱附加到表格,以在 SQL 查詢中查詢它們。

$properties 表格

  • $properties:指定表格的一般屬性

SELECT * FROM "ctas_nation$properties";
        key           |  value
----------------------+---------
 write.format.default | PARQUET

$history 表格

  • $history:表格狀態變更的歷程記錄

SELECT * FROM "ctas_nation$history";
           made_current_at            |     snapshot_id     | parent_id | is_current_ancestor
--------------------------------------+---------------------+-----------+---------------------
2022-11-25 20:56:31.784 Asia/Kolkata  | 7606232158543069775 | NULL      | true

$snapshots 表格

  • $snapshots:表格快照的詳細資料。如需詳細資訊,請參閱 Iceberg 表格規格中的 快照

SELECT * FROM "ctas_nation$snapshots";
             committed_at             |     snapshot_id     | parent_id | operation |                                                  manifest_list                                           |                                                                                 summary
--------------------------------------+---------------------+-----------+-----------+----------------------------------------------------------------------------------------------------------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2022-11-25 20:56:31.784 Asia/Kolkata  | 7606232158543069775 | NULL      | append    | s3://my-bucket/ctas_nation/metadata/snap-7606232158543069775-1-395a2cad-b244-409b-b030-cc44949e5a4e.avro | {changed-partition-count=1, added-data-files=1, total-equality-deletes=0, added-records=25, total-position-deletes=0, added-files-size=1648, total-delete-files=0, total-files-size=1648, total-records=25, total-data-files=1}

$manifests 表格

  • $manifests:不同表格快照的清單詳細資料。如需詳細資訊,請參閱 Iceberg 表格規格中的 清單

SELECT * FROM "ctas_nation$manifests";
                                           path                                  | length | partition_spec_id |  added_snapshot_id  | added_data_files_count | existing_data_files_count | deleted_data_files_count | partitions
---------------------------------------------------------------------------------+--------+-------------------+---------------------+------------------------+---------------------------+--------------------------+-----------
s3://my-bucket/ctas_nation/metadata/395a2cad-b244-409b-b030-cc44949e5a4e-m0.avro |   5957 |                 0 | 7606232158543069775 |                      1 |                         0 |                    0     |    []

$partitions 表格

  • $partitions:表格的詳細分割資訊

SELECT * FROM "ctas_nation$partitions";
 row_count | file_count | total_size |           nationkey           |                   name                   |          regionkey           |                          comment
-----------+------------+------------+-------------------------------+------------------------------------------+------------------------------+------------------------------------------------------------
    25     |          1 |       1648 | {min=0, max=24, null_count=0} | {min=ALGERIA, max=VIETNAM, null_count=0} | {min=0, max=4, null_count=0} | {min= haggle. careful, max=y final packaget, null_count=0}

$files 表格

  • $files:表格目前快照中資料檔案的概觀

SELECT * FROM "ctas_nation$files";
 content |                                      file_path                               | file_format | record_count | file_size_in_bytes |        column_sizes         |       value_counts       |  null_value_counts   | nan_value_counts |          lower_bounds                     |             upper_bounds                   | key_metadata | split_offsets | equality_ids
---------+------------------------------------------------------------------------------+-------------+--------------+--------------------+-----------------------------+--------------------------+----------------------+------------------+-------------------------------------------+--------------------------------------------+--------------+---------------+-------------
   0     | s3://my-bucket/ctas_nation/data/9f889274-6f74-4d28-8164-275eef99f660.parquet | PARQUET     |           25 |               1648 | {1=52, 2=222, 3=105, 4=757} | {1=25, 2=25, 3=25, 4=25} | {1=0, 2=0, 3=0, 4=0} |  NULL            | {1=0, 2=ALGERIA, 3=0, 4= haggle. careful} | {1=24, 2=VIETNAM, 3=4, 4=y final packaget} | NULL         | NULL          | NULL

$changelog 表格

此表格可讓您檢視表格隨著時間依特定順序發生的列層級變更。 $changelog 表格代表表格的變更歷程記錄,同時也讓資料可透過查詢來處理。

變更記錄查詢的結果一律會傳回具有四個欄的靜態結構描述

  1. operation:(VARCHAR)指出列是插入、更新或刪除。

  2. ordinal:(int)一個數字,指出相對於所有其他變更,必須將特定變更套用至表格的相對順序。

  3. snapshotid:(bigint)表示進行列層級變更的快照。

  4. rowdata:(row(T))其中包含特定列的資料。此類型的內部值符合父表格的結構描述。

可以使用下列名稱格式查詢變更記錄表格

... FROM "<table>[@<begin snapshot ID>]$changelog[@<end snapshot ID>]"
  • <table> 是表格的名稱。

  • <begin snapshot ID> 是您想要開始檢視變更的表格快照。此參數為選用參數。如果不存在,則使用最早可用的快照。

  • <end snapshot ID> 是您想要檢視變更的最後一個快照。此參數為選用參數。如果不存在,則使用表格的最新快照。

$changelog 表格的一個用途是找出何時將記錄插入表格或從表格中移除。若要完成此操作,可以將 $changelog 表格與 $snapshots 表格搭配使用。首先,從 $snapshots 表格中選擇快照 ID,以選擇起點。

SELECT * FROM "orders$snapshots";
                committed_at                 |     snapshot_id     |      parent_id      | operation |                                                                                       manifest_list                                                                                        |                                                                                                              summary
---------------------------------------------+---------------------+---------------------+-----------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 2023-09-26 08:45:20.930 America/Los_Angeles | 2423571386296047175 | NULL                | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-2423571386296047175-1-3f288b1c-95a9-406b-9e17-9cfe31a11b48.avro | {changed-partition-count=1, added-data-files=4, total-equality-deletes=0, added-records=100, total-position-deletes=0, added-files-size=9580, total-delete-files=0, total-files-size=9580, total-records=100, total-data-files=4}
 2023-09-26 08:45:36.942 America/Los_Angeles | 8702997868627997320 | 2423571386296047175 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-8702997868627997320-1-a2e1c714-7eed-4e2c-b144-dae4147ebaa4.avro | {changed-partition-count=1, added-data-files=1, total-equality-deletes=0, added-records=1, total-position-deletes=0, added-files-size=1687, total-delete-files=0, total-files-size=11267, total-records=101, total-data-files=5}
 2023-09-26 08:45:39.866 America/Los_Angeles | 7615903782581283889 | 8702997868627997320 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-7615903782581283889-1-d94c2114-fd22-4de2-9ab5-c0b5bf67282f.avro | {changed-partition-count=1, added-data-files=3, total-equality-deletes=0, added-records=3, total-position-deletes=0, added-files-size=4845, total-delete-files=0, total-files-size=16112, total-records=104, total-data-files=8}
 2023-09-26 08:45:48.404 America/Los_Angeles |  677209275408372885 | 7615903782581283889 | append    | file:/var/folders/g_/6_hxl7r16qdddw7956j_r88h0000gn/T/PrestoTest8140889264166671718/catalog/tpch/ctas_orders/metadata/snap-677209275408372885-1-ad69e208-1440-459b-93e8-48e61f961758.avro  | {changed-partition-count=1, added-data-files=3, total-equality-deletes=0, added-records=5, total-position-deletes=0, added-files-size=4669, total-delete-files=0, total-files-size=20781, total-records=109, total-data-files=11}

現在我們知道可在變更記錄中查詢的快照,我們可以查看表格建立後對表格進行了哪些變更。具體而言,此範例使用最早的快照 ID: 2423571386296047175

SELECT * FROM "ctas_orders@2423571386296047175$changelog" ORDER BY ordinal;
 operation | ordinal |     snapshotid      |                                                                                                                   rowdata
-----------+---------+---------------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 INSERT    |       0 | 8702997868627997320 | {orderkey=37504, custkey=1291, orderstatus=O, totalprice=165509.83, orderdate=1996-03-04, orderpriority=5-LOW, clerk=Clerk#000000871, shippriority=0, comment=c theodolites alongside of the fluffily bold requests haggle quickly against }
 INSERT    |       1 | 7615903782581283889 | {orderkey=12001, custkey=739, orderstatus=F, totalprice=138635.75, orderdate=1994-07-07, orderpriority=2-HIGH, clerk=Clerk#000000863, shippriority=0, comment=old, even theodolites. regular, special theodolites use furio}
 INSERT    |       1 | 7615903782581283889 | {orderkey=17989, custkey=364, orderstatus=F, totalprice=133669.05, orderdate=1994-01-17, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000547, shippriority=0, comment=ously express excuses. even theodolit}
 INSERT    |       1 | 7615903782581283889 | {orderkey=37504, custkey=1291, orderstatus=O, totalprice=165509.83, orderdate=1996-03-04, orderpriority=5-LOW, clerk=Clerk#000000871, shippriority=0, comment=c theodolites alongside of the fluffily bold requests haggle quickly against }
 INSERT    |       2 |  677209275408372885 | {orderkey=17991, custkey=92, orderstatus=O, totalprice=20732.51, orderdate=1998-07-09, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000636, shippriority=0, comment= the quickly express accounts. iron}
 INSERT    |       2 |  677209275408372885 | {orderkey=17989, custkey=364, orderstatus=F, totalprice=133669.05, orderdate=1994-01-17, orderpriority=4-NOT SPECIFIED, clerk=Clerk#000000547, shippriority=0, comment=ously express excuses. even theodolit}
 INSERT    |       2 |  677209275408372885 | {orderkey=17990, custkey=458, orderstatus=O, totalprice=218031.58, orderdate=1998-03-18, orderpriority=3-MEDIUM, clerk=Clerk#000000340, shippriority=0, comment=ounts wake final foxe}
 INSERT    |       2 |  677209275408372885 | {orderkey=18016, custkey=403, orderstatus=O, totalprice=174070.99, orderdate=1996-03-19, orderpriority=1-URGENT, clerk=Clerk#000000629, shippriority=0, comment=ly. quickly ironic excuses are furiously. carefully ironic pack}
 INSERT    |       2 |  677209275408372885 | {orderkey=18017, custkey=958, orderstatus=F, totalprice=203091.02, orderdate=1993-03-26, orderpriority=1-URGENT, clerk=Clerk#000000830, shippriority=0, comment=sleep quickly bold requests. slyly pending pinto beans haggle in pla}

程序

使用 CALL 陳述式來執行資料操作或管理工作。程序可在目錄的 system 結構描述中使用。

註冊表格

可以使用目錄註冊檔案系統中已存在表格資料和中繼資料的 Iceberg 表格。在目錄的 system 結構描述上使用 register_table 程序,並提供目標結構描述、所需的表格名稱以及表格中繼資料的位置

CALL iceberg.system.register_table('schema_name', 'table_name', 'hdfs://127.0.0.1:9000/path/to/iceberg/table/metadata/dir')

注意

如果指定位置存在多個相同版本的中繼資料檔案,則會使用最近修改的檔案。

可以選擇性地將中繼資料檔案作為 register_table 的引數包含在內,其中特定中繼資料檔案包含目標表格狀態

CALL iceberg.system.register_table('schema_name', 'table_name', 'hdfs://127.0.0.1:9000/path/to/iceberg/table/metadata/dir', '00000-35a08aed-f4b0-4010-95d2-9d73ef4be01c.metadata.json')

注意

Iceberg REST 目錄可能不支援表格註冊,具體取決於後端目錄的類型。

注意

使用 Hive 中繼資料儲存註冊表格時,呼叫程序的使用者會設定為表格的擁有者,並具有該表格的 SELECTINSERTUPDATEDELETE 權限。可以使用 GRANTREVOKE 命令變更這些權限。

注意

使用 Hive 目錄時,嘗試使用 Hive 連接器讀取註冊的 Iceberg 表格將會失敗。

取消註冊表格

可以使用目錄的 system 結構描述上的 unregister_table 程序,從目錄中取消註冊 Iceberg 表格

CALL iceberg.system.unregister_table('schema_name', 'table_name')

注意

僅當使用 Hive 目錄時,在呼叫 unregister_table 後,表格資料和中繼資料仍會保留在檔案系統中。這類似於 DROP TABLE 命令的列出行為。

回復至快照

將表格回復至特定快照 ID。Iceberg 可以透過在 Iceberg 的 system 結構描述上使用 rollback_to_snapshot 程序,回復至特定快照 ID

CALL iceberg.system.rollback_to_snapshot('table_name', 'snapshot_id');

以下引數可用

引數名稱

必要

類型

描述

表格

✔️

字串

要更新的表格名稱

snapshot_id

✔️

長整數

要回復至的快照 ID

過期快照

Iceberg 中的每個 DML (資料操作語言) 動作都會產生新的快照,同時保留舊資料和中繼資料,以進行快照隔離和時間回溯。使用 expire_snapshots 來移除較舊的快照及其檔案。

此程序會移除舊快照及其對應的檔案,並且永遠不會移除非過期快照所需的檔案。

以下引數可用

引數名稱

必要

類型

描述

結構描述

✔️

字串

要更新的表格結構描述

table_name

✔️

字串

要更新的表格名稱

older_than

時間戳記

將移除快照之前的時間戳記(預設值:5 天前)

retain_last

整數

要保留的祖先快照數目,無論 older_than 設定為何(預設值為 1)

snapshot_ids

長整數陣列

要過期的快照 ID 陣列

範例

  • 移除特定日期和時間之前的快照,但保留最後 10 個快照

    CALL iceberg.system.expire_snapshots('schema_name', 'table_name', TIMESTAMP '2023-08-31 00:00:00.000', 10);
    
  • 移除快照 ID 為 10001 和 10002 的快照 (請注意,這些快照 ID 不應為目前的快照)。

    CALL iceberg.system.expire_snapshots(schema => 'schema_name', table_name => 'table_name', snapshot_ids => ARRAY[10001, 10002]);
    

移除孤立檔案

用於移除 Iceberg 表格中任何中繼資料檔案皆未參考的檔案。

以下引數可用

引數名稱

必要

類型

描述

結構描述

✔️

字串

要清除的表格結構描述

table_name

✔️

字串

要清除的表格名稱

older_than

時間戳記

移除在此時間戳記之前建立的孤立檔案(預設:3 天前)

範例

  • 移除任何不屬於表格 db.sample 且早於指定時間戳記的檔案

    CALL iceberg.system.remove_orphan_files('db', 'sample', TIMESTAMP '2023-08-31 00:00:00.000');
    
  • 移除任何不屬於表格 db.sample 且在 3 天前建立的檔案 (預設)

    CALL iceberg.system.remove_orphan_files(schema => 'db', table_name => 'sample');
    

SQL 支援

Iceberg 連接器支援查詢和操作 Iceberg 表格和結構描述(資料庫)。以下是一些 Presto 支援的 SQL 操作範例

CREATE SCHEMA

建立一個名為 web 的新 Iceberg 結構描述,該結構描述將表格儲存在名為 my-bucket 的 S3 儲存貯體中

CREATE SCHEMA iceberg.web
WITH (location = 's3://my-bucket/')

CREATE TABLE

web 結構描述中建立一個名為 page_views 的新 Iceberg 表格,該表格使用 ORC 檔案格式儲存,並依 dscountry 分割

CREATE TABLE iceberg.web.page_views (
  view_time timestamp,
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
)
WITH (
  format = 'ORC',
  partitioning = ARRAY['ds', 'country']
)

建立使用 Iceberg 格式版本 2 的 Iceberg 表格

CREATE TABLE iceberg.web.page_views_v2 (
  view_time timestamp,
  user_id bigint,
  page_url varchar,
  ds date,
  country varchar
)
WITH (
  format = 'ORC',
  partitioning = ARRAY['ds', 'country'],
  format_version = '2'
)

分割欄轉換

除了選取一些特定的欄進行分割之外,您可以使用 transform 函式,並依欄的轉換值來分割表格。

Presto Iceberg 連接器中可用的轉換包括

  • Bucket (使用雜湊函式將資料分割成指定數量的儲存貯體)

  • Truncate (根據欄位截斷的值分割表格,並可以指定截斷值的寬度)

  • Identity (使用未修改的來源值分割資料)

  • Year (透過擷取日期或時間戳記年份,以整數值分割資料,以 1970 年起的年份為單位)

  • Month (透過擷取日期或時間戳記月份,以整數值分割資料,以 1970-01-01 起的月份為單位)

  • Day (透過擷取日期或時間戳記日期,以整數值分割資料,以 1970-01-01 起的天數為單位)

  • Hour (透過擷取時間戳記小時,以整數值分割資料,以 1970-01-01 00:00:00 起的小時為單位)

建立一個分割成 8 個大小相等範圍的儲存貯體的 Iceberg 表格

CREATE TABLE players (
    id int,
    name varchar,
    team varchar
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['bucket(team, 8)']
);

建立一個依 team 欄位的第一個字母分割的 Iceberg 表格

CREATE TABLE players (
    id int,
    name varchar,
    team varchar
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['truncate(team, 1)']
);

建立一個依 ds 分割的 Iceberg 表格

CREATE TABLE players (
    id int,
    name varchar,
    team varchar,
    ds date
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['year(ds)']
);

建立一個依 ts 分割的 Iceberg 表格

CREATE TABLE players (
    id int,
    name varchar,
    team varchar,
    ts timestamp
)
WITH (
    format = 'ORC',
    partitioning = ARRAY['hour(ts)']
);

CREATE VIEW

Iceberg 連接器支援在 Hive 和 Glue 中繼存放區中建立檢視。若要為 CREATE TABLE 範例中建立的 iceberg.web.page_views 表格建立名為 view_page_views 的檢視

CREATE VIEW iceberg.web.view_page_views AS SELECT user_id, country FROM iceberg.web.page_views;

INSERT INTO

將資料插入 page_views 表格

INSERT INTO iceberg.web.page_views VALUES(TIMESTAMP '2023-08-12 03:04:05.321', 1, 'https://example.com', current_date, 'country');

CREATE TABLE AS SELECT

從現有的表格 page_views 建立新表格 page_views_new

CREATE TABLE iceberg.web.page_views_new AS SELECT * FROM iceberg.web.page_views

SELECT

連接器支援 Iceberg 格式版本 1 和版本 2 的 SELECT 表格操作

SELECT * FROM iceberg.web.page_views;

SELECT * FROM iceberg.web.page_views_v2;

具有刪除檔案的表格

Iceberg V2 表格支援列級刪除。如需更多資訊,請參閱 Iceberg 表格規格中的 列級刪除。Presto 支援讀取刪除檔案,包括位置刪除檔案和等式刪除檔案。讀取時,Presto 會合併這些刪除檔案以讀取最新的結果。

ALTER TABLE

Iceberg 連接器支援變更表格操作

ALTER TABLE iceberg.web.page_views ADD COLUMN zipcode VARCHAR;

ALTER TABLE iceberg.web.page_views RENAME COLUMN zipcode TO location;

ALTER TABLE iceberg.web.page_views DROP COLUMN location;

若要新增欄做為分割欄,請識別欄的轉換函式。表格會依欄的轉換值分割

ALTER TABLE iceberg.web.page_views ADD COLUMN zipcode VARCHAR WITH (partitioning = 'identity');

ALTER TABLE iceberg.web.page_views ADD COLUMN location VARCHAR WITH (partitioning = 'truncate(2)');

ALTER TABLE iceberg.web.page_views ADD COLUMN location VARCHAR WITH (partitioning = 'bucket(8)');

ALTER TABLE iceberg.web.page_views ADD COLUMN dt date WITH (partitioning = 'year');

ALTER TABLE iceberg.web.page_views ADD COLUMN ts timestamp WITH (partitioning = 'month');

ALTER TABLE iceberg.web.page_views ADD COLUMN dt date WITH (partitioning = 'day');

ALTER TABLE iceberg.web.page_views ADD COLUMN ts timestamp WITH (partitioning = 'hour');

TRUNCATE

Iceberg 連接器可以使用 TRUNCATE TABLE 從表格中刪除所有資料,而不會從中繼資料目錄中捨棄表格。

TRUNCATE TABLE nation;
TRUNCATE TABLE;
SELECT * FROM nation;
 nationkey | name | regionkey | comment
-----------+------+-----------+---------
(0 rows)

DELETE

Iceberg 連接器可以使用 DELETE FROM 從表格中刪除資料。例如,若要從表格 lineitem 中刪除

DELETE FROM lineitem;

DELETE FROM lineitem WHERE linenumber = 1;

DELETE FROM lineitem WHERE linenumber not in (1, 3, 5, 7) and linestatus in ('O', 'F');

注意

篩選的欄僅支援比較運算子,例如 EQUALS、LESS THAN 或 LESS THAN EQUALS。

刪除僅能發生在最新的快照上。

對於 V1 表格,Iceberg 連接器只能在一個或多個完整分割區中刪除資料。篩選條件中的欄必須全部是目標表格的身分轉換分割欄。

DROP TABLE

捨棄表格 page_views

DROP TABLE iceberg.web.page_views
  • 使用 Hive 中繼存放區和 Glue 目錄捨棄 Iceberg 表格只會從中繼存放區移除中繼資料。

  • 使用 Hadoop 和 Nessie 目錄捨棄 Iceberg 表格會移除表格中的所有資料和中繼資料。

DROP VIEW

捨棄檢視 view_page_views

DROP VIEW iceberg.web.view_page_views;

DROP SCHEMA

捨棄結構描述 iceberg.web

DROP SCHEMA iceberg.web

SHOW CREATE TABLE

使用 SHOW CREATE TABLE 顯示建立指定 Iceberg 表格的 SQL 陳述式。

例如,從已分割的 Iceberg 表格 customer 執行 SHOW CREATE TABLE

SHOW CREATE TABLE customer;
CREATE TABLE iceberg.tpch_iceberg.customer (
    "custkey" bigint,
    "name" varchar,
    "address" varchar,
    "nationkey" bigint,
    "phone" varchar,
    "acctbal" double,
    "mktsegment" varchar,
    "comment" varchar
)
WITH (
    delete_mode = 'copy-on-write',
    format = 'PARQUET',
    format_version = '2',
    location = 's3a://tpch-iceberg/customer',
    partitioning = ARRAY['mktsegment']
)
(1 row)

從未分割的 Iceberg 表格 region 執行 SHOW CREATE TABLE

SHOW CREATE TABLE region;
CREATE TABLE iceberg.tpch_iceberg.region (
    "regionkey" bigint,
    "name" varchar,
    "comment" varchar
)
WITH (
    delete_mode = 'copy-on-write',
    format = 'PARQUET',
    format_version = '2',
    location = 's3a://tpch-iceberg/region'
)
(1 row)

SHOW COLUMNS

使用 SHOW COLUMNS 列出表格中的欄以及其資料類型和其他屬性。

例如,從已分割的 Iceberg 表格 customer 執行 SHOW COLUMNS

SHOW COLUMNS FROM customer;
   Column   |  Type   |     Extra     | Comment
------------+---------+---------------+---------
 custkey    | bigint  |               |
 name       | varchar |               |
 address    | varchar |               |
 nationkey  | bigint  |               |
 phone      | varchar |               |
 acctbal    | double  |               |
 mktsegment | varchar | partition key |
 comment    | varchar |               |
 (8 rows)

從未分割的 Iceberg 表格 region 執行 SHOW COLUMNS

SHOW COLUMNS FROM region;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 regionkey | bigint  |       |
 name      | varchar |       |
 comment   | varchar |       |
 (3 rows)

DESCRIBE

使用 DESCRIBE 列出表格中的欄以及其資料類型和其他屬性。DESCRIBESHOW COLUMNS 的別名。

例如,從已分割的 Iceberg 表格 customer 執行 DESCRIBE

DESCRIBE customer;
   Column   |  Type   |     Extra     | Comment
------------+---------+---------------+---------
 custkey    | bigint  |               |
 name       | varchar |               |
 address    | varchar |               |
 nationkey  | bigint  |               |
 phone      | varchar |               |
 acctbal    | double  |               |
 mktsegment | varchar | partition key |
 comment    | varchar |               |
 (8 rows)

從未分割的 Iceberg 表格 region 執行 DESCRIBE

DESCRIBE region;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 regionkey | bigint  |       |
 name      | varchar |       |
 comment   | varchar |       |
 (3 rows)

結構描述演進

Iceberg 和 Presto Iceberg 連接器支援就地表格演進,也稱為結構描述演進,例如新增、捨棄和重新命名欄。透過結構描述演進,使用者可以在啟用 Presto Iceberg 連接器後,使用 SQL 演進表格結構描述。

Parquet 寫入器版本

Presto 現在支援 Iceberg 目錄的 Parquet 寫入器版本 V1 和 V2。可以使用工作階段屬性 parquet_writer_version 和組態屬性 hive.parquet.writer.version 切換。這些屬性的有效值為 PARQUET_1_0PARQUET_2_0。預設值為 PARQUET_1_0

範例查詢

讓我們建立一個名為 ctas_nation 的 Iceberg 表格,該表格是從 TPCH nation 表格建立的。表格有四個欄:nationkeynameregionkeycomment

USE iceberg.tpch;
CREATE TABLE IF NOT EXISTS ctas_nation AS (SELECT * FROM nation);
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

我們可以簡單地使用 ALTER TABLE 陳述式將新欄新增至 Iceberg 表格。下列查詢會將名為 zipcode 的新欄新增至表格。

ALTER TABLE ctas_nation ADD COLUMN zipcode VARCHAR;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
 zipcode   | varchar |       |
(5 rows)

我們也可以將新欄重新命名為另一個名稱 address

ALTER TABLE ctas_nation RENAME COLUMN zipcode TO address;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
 address  | varchar |       |
(5 rows)

最後,我們可以刪除新欄。表格欄將還原為原始狀態。

ALTER TABLE ctas_nation DROP COLUMN address;
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

時間旅行

Iceberg 和 Presto Iceberg 連接器支援透過唯一快照 ID 識別的表格快照進行時間旅行。快照 ID 儲存在 $snapshots 中繼資料表格中。您可以將表格的狀態回溯至先前的快照 ID。它也支援使用 VERSION (SYSTEM_VERSION) 和 TIMESTAMP (SYSTEM_TIME) 選項進行時間旅行查詢。

範例查詢

結構描述演進 中的範例查詢類似,從 TPCH nation 表格建立一個名為 ctas_nation 的 Iceberg 表格

USE iceberg.tpch;
CREATE TABLE IF NOT EXISTS ctas_nation AS (SELECT * FROM nation);
DESCRIBE ctas_nation;
  Column   |  Type   | Extra | Comment
-----------+---------+-------+---------
 nationkey | bigint  |       |
 name      | varchar |       |
 regionkey | bigint  |       |
 comment   | varchar |       |
(4 rows)

我們可以從 $snapshots 中繼資料表格中找到 Iceberg 表格的快照 ID。

SELECT snapshot_id FROM iceberg.tpch."ctas_nation$snapshots" ORDER BY committed_at;
     snapshot_id
---------------------
 5837462824399906536
(1 row)

目前,由於我們才剛建立表格,因此只有一個快照 ID。讓我們在表格中插入一個資料列,並查看快照 ID 的變更。

INSERT INTO ctas_nation VALUES(25, 'new country', 1, 'comment');
SELECT snapshot_id FROM iceberg.tpch."ctas_nation$snapshots" ORDER BY committed_at;
     snapshot_id
---------------------
 5837462824399906536
 5140039250977437531
(2 rows)

現在,當新資料列插入表格時,會建立一個新的快照 (5140039250977437531)。可以透過執行來驗證新資料列

SELECT * FROM ctas_nation WHERE name = 'new country';
 nationkey |    name     | regionkey | comment
-----------+-------------+-----------+---------
        25 | new country |         1 | comment
(1 row)

透過時間旅行功能,我們可以透過呼叫 iceberg.system.rollback_to_snapshot 回溯至沒有新資料列的先前狀態

CALL iceberg.system.rollback_to_snapshot('tpch', 'ctas_nation', 5837462824399906536);

現在,如果我們再次檢查表格,我們會發現由於我們已回溯至先前的狀態,因此新插入的資料列已不再存在。

SELECT * FROM ctas_nation WHERE name = 'new country';
 nationkey | name | regionkey | comment
-----------+------+-----------+---------
(0 rows)

使用 VERSION (SYSTEM_VERSION) 和 TIMESTAMP (SYSTEM_TIME) 進行時間旅行

使用 Iceberg 連接器存取資料表的歷史資料。您可以查看資料表在特定時間點的狀態,即使資料在那之後已經變更或刪除。

// snapshot ID 5300424205832769799
INSERT INTO ctas_nation VALUES(10, 'united states', 1, 'comment');

// snapshot ID 6891257133877048303
INSERT INTO ctas_nation VALUES(20, 'canada', 2, 'comment');

// snapshot ID 705548372863208787
INSERT INTO ctas_nation VALUES(30, 'mexico', 3, 'comment');

// snapshot ID for first record
SELECT * FROM ctas_nation FOR VERSION AS OF 5300424205832769799;

// snapshot ID for first record using SYSTEM_VERSION
SELECT * FROM ctas_nation FOR SYSTEM_VERSION AS OF 5300424205832769799;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)
// snapshot ID for second record using BEFORE clause to retrieve previous state
SELECT * FROM ctas_nation FOR SYSTEM_VERSION BEFORE 6891257133877048303;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)

在上述範例中,SYSTEM_VERSION 可以用作 VERSION 的別名。

您可以使用 FOR TIMESTAMP AS OF TIMESTAMP 來存取資料表的歷史資料。查詢會返回最接近指定時間戳記的資料表快照所呈現的資料表狀態。在此範例中,SYSTEM_TIME 可以用作 TIMESTAMP 的別名。

// In following query, timestamp string is matching with second inserted record.
SELECT * FROM ctas_nation FOR TIMESTAMP AS OF TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';

// Same example using SYSTEM_TIME as an alias for TIMESTAMP
SELECT * FROM ctas_nation FOR SYSTEM_TIME AS OF TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
        20 | canada        |         2 | comment
(2 rows)

FOR TIMESTAMP AS OF 後面的選項可以接受任何返回帶有時區的時間戳記值的運算式。例如,TIMESTAMP ‘2023-10-17 13:29:46.822 America/Los_Angeles’ 是一個常數字串的運算式。在以下查詢中,運算式 CURRENT_TIMESTAMP 返回目前的帶時區時間戳記值。

SELECT * FROM ctas_nation FOR TIMESTAMP AS OF CURRENT_TIMESTAMP;
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
        20 | canada        |         2 | comment
        30 | mexico        |         3 | comment
(3 rows)
// In following query, timestamp string is matching with second inserted record.
// BEFORE clause returns first record which is less than timestamp of the second record.
SELECT * FROM ctas_nation FOR TIMESTAMP BEFORE TIMESTAMP '2023-10-17 13:29:46.822 America/Los_Angeles';
 nationkey |      name     | regionkey | comment
-----------+---------------+-----------+---------
        10 | united states |         1 | comment
(1 row)

類型映射

PrestoDB 和 Iceberg 具有彼此不支援的資料類型。當使用 Iceberg 來讀取或寫入資料時,Presto 會將每個 Iceberg 資料類型變更為對應的 Presto 資料類型,並從每個 Presto 資料類型變更為可比較的 Iceberg 資料類型。下表詳細說明了 PrestoDB 和 Iceberg 之間的具體類型映射。

Iceberg 到 PrestoDB 類型映射

Iceberg 類型到相關 PrestoDB 類型的映射

Iceberg 到 PrestoDB 類型映射

Iceberg 類型

PrestoDB 類型

BOOLEAN

BOOLEAN

BINARY, FIXED

VARBINARY

DATE

DATE

DECIMAL

DECIMAL

DOUBLE

DOUBLE

LONG

BIGINT

FLOAT

REAL

INTEGER

INTEGER

TIME

TIME

TIMESTAMP

TIMESTAMP

STRING

VARCHAR

LIST

ARRAY

MAP

MAP

STRUCT

ROW

不支援其他類型。

PrestoDB 到 Iceberg 類型映射

PrestoDB 類型到相關 Iceberg 類型的映射

PrestoDB 到 Iceberg 類型映射

PrestoDB 類型

Iceberg 類型

BOOLEAN

BOOLEAN

INTEGER

INTEGER

BIGINT

LONG

REAL

FLOAT

DOUBLE

DOUBLE

DECIMAL

DECIMAL

VARCHAR

STRING

VARBINARY

BINARY

DATE

DATE

ROW

STRUCT

ARRAY

LIST

MAP

MAP

TIME

TIME

TIMESTAMP

TIMESTAMP WITHOUT ZONE

TIMESTAMP WITH TIMEZONE

TIMESTAMP WITH ZONE

不支援其他類型。