Работа с таблицами Iceberg в Impala

Apache Iceberg — это открытый высокопроизводительный формат для больших аналитических таблиц. Сервис ADH Impala поддерживает данный формат, позволяя работать с таблицами Iceberg с помощью SQL и выполнять аналитические операции.

Каталоги Iceberg

В архитектуре Iceberg каталог (catalog) — это именованное хранилище таблиц и их метаданных. Для работы с Iceberg-таблицами в Impala доступны следующие типы каталогов:

  • HiveCatalog. Является дефолтным каталогом в Impala. Использует Hive Metastore для хранения метаданных таблиц. Данный каталог используется во всех примерах, приведенных в статье.

  • HadoopCatalog. Каталог с указанием пути, предполагающий наличие в HDFS директории, где хранятся отдельные таблицы Iceberg.

  • HadoopTables. Каталог, предполагающий наличие HDFS-директории, где хранятся данные нескольких таблиц Iceberg.

Также можно использовать кастомные каталоги для существующих таблиц. Однако автоматическое обновление метаданных не работает для таблиц в кастомном каталоге. Необходимо вручную вызывать REFRESH для таких таблиц, когда они изменяются вне Impala.

Команды DDL

Создание таблицы

Чтобы создать таблицу Iceberg, добавьте предложение STORED AS ICEBERG к стандартному оператору Impala CREATE TABLE.

Пример:

CREATE TABLE default.impala_ice_test (
    txn_id int,
    acc_id int,
    txn_value double,
    txn_date date)
STORED AS ICEBERG;

Выполните команду DESCRIBE FORMATTED для получения информации о только что созданной таблице:

DESCRIBE FORMATTED default.impala_ice_test;
Пример вывода
Query: describe formatted impala_ice_test
+------------------------------+----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| name                         | type                                               | comment                                                                                                                                                                                                                                                                                                                                 |
+------------------------------+----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| # col_name                   | data_type                                          | comment                                                                                                                                                                                                                                                                                                                                 |
|                              | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| txn_id                       | int                                                | NULL                                                                                                                                                                                                                                                                                                                                    |
| acc_id                       | int                                                | NULL                                                                                                                                                                                                                                                                                                                                    |
| txn_value                    | double                                             | NULL                                                                                                                                                                                                                                                                                                                                    |
| txn_date                     | date                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
|                              | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| # Detailed Table Information | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| Database:                    | default                                            | NULL                                                                                                                                                                                                                                                                                                                                    |
| OwnerType:                   | USER                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| Owner:                       | admin                                              | NULL                                                                                                                                                                                                                                                                                                                                    |
| CreateTime:                  | Thu Jul 04 10:50:39 UTC 2024                       | NULL                                                                                                                                                                                                                                                                                                                                    |
| LastAccessTime:              | Sun Jan 25 08:15:21 UTC 1970                       | NULL                                                                                                                                                                                                                                                                                                                                    |
| Retention:                   | 2147483647                                         | NULL                                                                                                                                                                                                                                                                                                                                    |
| Location:                    | hdfs://adh/apps/hive/warehouse/impala_ice_test     | NULL                                                                                                                                                                                                                                                                                                                                    |
| Erasure Coding Policy:       | NONE                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| Table Type:                  | EXTERNAL_TABLE                                     | NULL                                                                                                                                                                                                                                                                                                                                    |
| Table Parameters:            | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
|                              | EXTERNAL                                           | TRUE                                                                                                                                                                                                                                                                                                                                    |
|                              | OBJCAPABILITIES                                    | EXTREAD,EXTWRITE                                                                                                                                                                                                                                                                                                                        |
|                              | accessType                                         | 8                                                                                                                                                                                                                                                                                                                                       |
|                              | current-schema                                     | {\"type\":\"struct\",\"schema-id\":0,\"fields\":[{\"id\":1,\"name\":\"txn_id\",\"required\":false,\"type\":\"int\"},{\"id\":2,\"name\":\"acc_id\",\"required\":false,\"type\":\"int\"},{\"id\":3,\"name\":\"txn_value\",\"required\":false,\"type\":\"double\"},{\"id\":4,\"name\":\"txn_date\",\"required\":false,\"type\":\"date\"}]} |
|                              | engine.hive.enabled                                | true                                                                                                                                                                                                                                                                                                                                    |
|                              | external.table.purge                               | TRUE                                                                                                                                                                                                                                                                                                                                    |
|                              | metadata_location                                  | hdfs://adh/apps/hive/warehouse/impala_ice_test/metadata/00000-c3406504-fe59-4464-8b1f-01971fc3b949.metadata.json                                                                                                                                                                                                                        |
|                              | numFiles                                           | 1                                                                                                                                                                                                                                                                                                                                       |
|                              | snapshot-count                                     | 0                                                                                                                                                                                                                                                                                                                                       |
|                              | storage_handler                                    | org.apache.iceberg.mr.hive.HiveIcebergStorageHandler                                                                                                                                                                                                                                                                                    |
|                              | table_type                                         | ICEBERG                                                                                                                                                                                                                                                                                                                                 |
|                              | totalSize                                          | 1914                                                                                                                                                                                                                                                                                                                                    |
|                              | transient_lastDdlTime                              | 1720090239                                                                                                                                                                                                                                                                                                                              |
|                              | uuid                                               | 5495460c-53fe-4fb7-9120-0d5dad7fd022                                                                                                                                                                                                                                                                                                    |
|                              | write.format.default                               | parquet                                                                                                                                                                                                                                                                                                                                 |
|                              | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| # Storage Information        | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| SerDe Library:               | org.apache.iceberg.mr.hive.HiveIcebergSerDe        | NULL                                                                                                                                                                                                                                                                                                                                    |
| InputFormat:                 | org.apache.iceberg.mr.hive.HiveIcebergInputFormat  | NULL                                                                                                                                                                                                                                                                                                                                    |
| OutputFormat:                | org.apache.iceberg.mr.hive.HiveIcebergOutputFormat | NULL                                                                                                                                                                                                                                                                                                                                    |
| Compressed:                  | No                                                 | NULL                                                                                                                                                                                                                                                                                                                                    |
| Sort Columns:                | []                                                 | NULL                                                                                                                                                                                                                                                                                                                                    |
|                              | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
| # Constraints                | NULL                                               | NULL                                                                                                                                                                                                                                                                                                                                    |
+------------------------------+----------------------------------------------------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Параметр table_type в выводе указывает на то, что таблица была создана как Iceberg-таблица.

По умолчанию Impala создает таблицы Iceberg, используя формат данных Parquet. Чтобы использовать ORC или AVRO, установите свойство таблицы write.format.default, как показано ниже:

CREATE TABLE default.impala_ice_test_orc (
    txn_id int,
    acc_id int,
    txn_value double,
    txn_date date)
STORED AS ICEBERG
TBLPROPERTIES('write.format.default'='ORC');
РЕКОМЕНДАЦИЯ
Больше информации о свойствах таблиц Iceberg можно найти в документации Impala.

CREATE TABLE AS SELECT

Вы можете использовать синтаксис CREATE TABLE AS <tbl_name> (CTAS) для создания таблицы Iceberg на основе уже существующей таблицы.

Например:

CREATE TABLE default.impala_ice_test_ctas
STORED AS ICEBERG
AS SELECT txn_value, txn_date FROM default.impala_ice_test;
Пример вывода DESCRIBE FORMATTED
DESCRIBE FORMATTED default.impala_ice_test_ctas;
+------------------------------+-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| name                         | type                                                | comment                                                                                                                                                                                           |
+------------------------------+-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| # col_name                   | data_type                                           | comment                                                                                                                                                                                           |
|                              | NULL                                                | NULL                                                                                                                                                                                              |
| txn_value                    | double                                              | NULL                                                                                                                                                                                              |
| txn_date                     | date                                                | NULL                                                                                                                                                                                              |
|                              | NULL                                                | NULL                                                                                                                                                                                              |
| # Detailed Table Information | NULL                                                | NULL                                                                                                                                                                                              |
| Database:                    | default                                             | NULL                                                                                                                                                                                              |
| OwnerType:                   | USER                                                | NULL                                                                                                                                                                                              |
| Owner:                       | admin                                               | NULL                                                                                                                                                                                              |
| CreateTime:                  | Thu Jul 04 11:07:31 UTC 2024                        | NULL                                                                                                                                                                                              |
| LastAccessTime:              | Sun Jan 25 08:32:12 UTC 1970                        | NULL                                                                                                                                                                                              |
| Retention:                   | 2147483647                                          | NULL                                                                                                                                                                                              |
| Location:                    | hdfs://adh/apps/hive/warehouse/impala_ice_test_ctas | NULL                                                                                                                                                                                              |
| Erasure Coding Policy:       | NONE                                                | NULL                                                                                                                                                                                              |
| Table Type:                  | EXTERNAL_TABLE                                      | NULL                                                                                                                                                                                              |
| Table Parameters:            | NULL                                                | NULL                                                                                                                                                                                              |
|                              | EXTERNAL                                            | TRUE                                                                                                                                                                                              |
|                              | OBJCAPABILITIES                                     | EXTREAD,EXTWRITE                                                                                                                                                                                  |
|                              | accessType                                          | 8                                                                                                                                                                                                 |
|                              | current-schema                                      | {\"type\":\"struct\",\"schema-id\":0,\"fields\":[{\"id\":1,\"name\":\"txn_value\",\"required\":false,\"type\":\"double\"},{\"id\":2,\"name\":\"txn_date\",\"required\":false,\"type\":\"date\"}]} |
|                              | engine.hive.enabled                                 | true                                                                                                                                                                                              |
|                              | external.table.purge                                | TRUE                                                                                                                                                                                              |
|                              | metadata_location                                   | hdfs://adh/apps/hive/warehouse/impala_ice_test_ctas/metadata/00000-c3871ac4-ca86-4c6d-be6c-116f3bf7cdf9.metadata.json                                                                             |
|                              | numFiles                                            | 1                                                                                                                                                                                                 |
|                              | snapshot-count                                      | 0                                                                                                                                                                                                 |
|                              | storage_handler                                     | org.apache.iceberg.mr.hive.HiveIcebergStorageHandler                                                                                                                                              |
|                              | table_type                                          | ICEBERG                                                                                                                                                                                           |
|                              | totalSize                                           | 1531                                                                                                                                                                                              |
|                              | transient_lastDdlTime                               | 1720091251                                                                                                                                                                                        |
|                              | uuid                                                | 5b792d0b-4e67-4a2b-957c-86e41970c977                                                                                                                                                              |
|                              | write.format.default                                | parquet                                                                                                                                                                                           |
|                              | NULL                                                | NULL                                                                                                                                                                                              |
| # Storage Information        | NULL                                                | NULL                                                                                                                                                                                              |
| SerDe Library:               | org.apache.iceberg.mr.hive.HiveIcebergSerDe         | NULL                                                                                                                                                                                              |
| InputFormat:                 | org.apache.iceberg.mr.hive.HiveIcebergInputFormat   | NULL                                                                                                                                                                                              |
| OutputFormat:                | org.apache.iceberg.mr.hive.HiveIcebergOutputFormat  | NULL                                                                                                                                                                                              |
| Compressed:                  | No                                                  | NULL                                                                                                                                                                                              |
| Sort Columns:                | []                                                  | NULL                                                                                                                                                                                              |
|                              | NULL                                                | NULL                                                                                                                                                                                              |
| # Constraints                | NULL                                                | NULL                                                                                                                                                                                              |
+------------------------------+-----------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+

Удаление таблицы

Вы можете удалить таблицу с помощью команды DROP TABLE <tbl_name>. Пример:

DROP TABLE default.impala_ice_test;

Если установлено свойство таблицы external.table.purge=true, команда также удаляет файлы данных из HDFS. По умолчанию свойство external.table.purge равно true, если таблица была создана с помощью команды CREATE TABLE в Impala. Если таблица создана с помощью CREATE EXTERNAL TABLE (таблица уже существует и только регистрируется в каталоге), данное свойство устанавливается как false, поэтому DROP TABLE не удаляет данные таблицы, а лишь удаляет таблицу из каталога.

Таблицы Iceberg V2

Формат таблиц Iceberg V2 поддерживает обновление на уровне строк для операций DELETE и UPDATE, используя подход "merge-on-read". При использовании этого формата, вместо того чтобы переписывать существующие файлы данных, Iceberg создает файлы удаления (delete files), которые хранят информацию об удаленных записях. Эти файлы содержат путь к файлу и позицию удаленных строк (position deletes).

Чтобы создать таблицу Iceberg, использующую формат Iceberg V2, укажите свойство таблицы format-version=2 при создании таблицы.

Пример:

CREATE TABLE default.impala_ice_test_v2 (
    txn_id int,
    acc_id int,
    txn_value double,
    txn_date date)
STORED AS ICEBERG
TBLPROPERTIES('format-version'='2');

Вы также можете обновить существующую таблицу Iceberg V1 до версии Iceberg V2 с помощью команды ALTER TABLE. Пример показан ниже.

ALTER TABLE default.impala_ice_test
SET TBLPROPERTIES('format-version'='2');

Эволюция схемы

Iceberg поддерживает эволюцию схемы, что позволяет переупорядочивать, удалять или изменять столбцы без ущерба для читаемости старых файлов данных (до изменения схемы).

ПРИМЕЧАНИЕ
Impala не поддерживает эволюцию схемы для таблиц в формате AVRO. Дополнительная информация доступна в документации Iceberg.

Ниже приведены команды изменения схемы Iceberg-таблиц, поддерживаемые в Impala.

ALTER TABLE …​ RENAME TO

 
Следующая команда переименовывает таблицу Iceberg.

ALTER TABLE default.impala_ice_test
RENAME TO default.impala_ice_test_new;
ALTER TABLE …​ ADD COLUMN

 
Вы можете добавить столбец в существующую таблицу Iceberg, как показано ниже.

ALTER TABLE default.impala_ice_test
ADD COLUMN `comment` string;

Результат выполнения команды:

+----------------------------+
| summary                    |
+----------------------------+
| Column(s) have been added. |
+----------------------------+
ALTER TABLE …​ DROP COLUMN

 
Вы можете удалить столбец из существующей таблицы Iceberg, как показано ниже.

ALTER TABLE default.impala_ice_test
DROP COLUMN `comment`;

Результат выполнения команды:

+--------------------------+
| summary                  |
+--------------------------+
| Column has been dropped. |
+--------------------------+
ALTER TABLE …​ CHANGE COLUMN

 
Вы можете изменить имя столбца и его тип, если новый тип совместим со старым.

ALTER TABLE default.impala_ice_test
CHANGE txn_id txn_id BIGINT;

Вывод:

+--------------------------+
| summary                  |
+--------------------------+
| Column has been altered. |
+--------------------------+

Создание таблицы с партициями

В Impala вы можете создавать Iceberg-таблицы с партициями, используя традиционное партиционирование по значению (value-based partitioning). Синтаксис показан ниже:

CREATE TABLE default.impala_ice_test_partitioned (
    txn_id int,
    txn_value double,
    txn_date date)
PARTITIONED BY (acc_id int)
STORED AS ICEBERG;

Также можно создать таблицу с партициями, используя одно или несколько выражений преобразования (transform expressions). Пример показан ниже.

CREATE TABLE default.impala_ice_test_partitioned_transform (
    txn_id int,
    acc_id int,
    txn_value double,
    txn_date date)
PARTITIONED BY SPEC (
    BUCKET(3, acc_id), (1)
    day(txn_date)) (2)
STORED AS ICEBERG;
1 Первая часть выражения преобразования заставляет Iceberg распределять вставленные данные между 3 бакетами. Для каждого значения acc_id, которое должно быть записано, Iceberg вычисляет хеш и получает остаток от деления на 3 (hash(acc_id) mod 3). Полученное значение определяет бакет, в который будут записаны данные.
2 Затем в рамках каждого бакета Iceberg создает партиции по дате.

Для таблицы, созданной с помощью вышеуказанной команды, Impala создает следующую структуру директорий в HDFS.

[admin@ka-adh-2 ~]$ hdfs dfs -ls -R /apps/hive/warehouse
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=0
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=0/txn_date_day=2023-01-03
-rw-r--r--   3 impala hadoop       1153 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=0/txn_date_day=2023-01-03/314da83d47eee296-145c34e600000000_1592985449_data.0.parq
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=1
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=1/txn_date_day=2023-01-02
-rw-r--r--   3 impala hadoop       1153 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=1/txn_date_day=2023-01-02/314da83d47eee296-145c34e600000000_584411471_data.0.parq
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=2
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=2/txn_date_day=2023-01-01
-rw-r--r--   3 impala hadoop       1153 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/data/acc_id_bucket=2/txn_date_day=2023-01-01/314da83d47eee296-145c34e600000000_1148089692_data.0.parq
drwxrwxr-x   - impala hadoop          0 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/metadata
-rw-r--r--   3 impala hadoop       2385 2024-07-05 14:00 /apps/hive/warehouse/impala_ice_test_partitioned_transform/metadata/00000-b04f03f7-f770-44a1-825b-8e84e4392f41.metadata.json
-rw-r--r--   3 impala hadoop       3564 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/metadata/00001-13512042-67f5-4327-933c-978d41be5df1.metadata.json
-rw-r--r--   3 impala hadoop       6539 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/metadata/24a8910e-e616-4d4b-ace5-46987f83fe9a-m0.avro
-rw-r--r--   3 impala hadoop       3804 2024-07-05 14:01 /apps/hive/warehouse/impala_ice_test_partitioned_transform/metadata/snap-4359281668985942129-1-24a8910e-e616-4d4b-ace5-46987f83fe9a.avro

Для просмотра партиций можно использовать команду SHOW PARTITIONS. Пример вывода показан ниже.

+----------------------------------------------+----------------+-----------------+
| Partition                                    | Number Of Rows | Number Of Files |
+----------------------------------------------+----------------+-----------------+
| {"acc_id_bucket":"0","txn_date_day":"19360"} | 1              | 1               |
| {"acc_id_bucket":"0","txn_date_day":"19361"} | 1              | 1               |
| {"acc_id_bucket":"0","txn_date_day":"19723"} | 1              | 1               |
| {"acc_id_bucket":"0","txn_date_day":"19725"} | 1              | 1               |
| {"acc_id_bucket":"1","txn_date_day":"19359"} | 1              | 1               |
| {"acc_id_bucket":"1","txn_date_day":"19360"} | 1              | 1               |
| {"acc_id_bucket":"2","txn_date_day":"19358"} | 1              | 1               |
| {"acc_id_bucket":"2","txn_date_day":"19361"} | 1              | 1               |
| {"acc_id_bucket":"2","txn_date_day":"19392"} | 1              | 1               |
+----------------------------------------------+----------------+-----------------+

Iceberg поддерживает эволюцию партиций (partition evolution), что позволяет изменять партиционирование таблицы без необходимости перезаписи существующих данных. Партиционирование таблицы можно изменить с помощью оператора ALTER TABLE SET PARTITION SPEC, как показано в примере ниже.

ALTER TABLE default.impala_ice_test_partitioned
SET PARTITION SPEC (DAY(txn_date));

Вывод:

+-------------------------+
| summary                 |
+-------------------------+
| Updated partition spec. |
+-------------------------+

Команды DML

Запись данных

В Impala вы можете записывать данные в таблицу Iceberg с помощью команд INSERT INTO и INSERT OVERWRITE.

Пример:

INSERT INTO default.impala_ice_test VALUES
(1, 1001, 150.50, '2023-01-04'),
(2, 1002, 200.50, '2023-01-03'),
(3, 1003, 50.00, '2024-01-03');

С помощью INSERT OVERWRITE можно заменить данные в таблице на результат запроса. Например:

INSERT OVERWRITE TABLE default.impala_ice_test_tmp
SELECT * from default.impala_ice_test;
ПРИМЕЧАНИЕ
Операция INSERT OVERWRITE не поддерживается для таблиц, использующих преобразование партиций типа BUCKET.

Удаление данных

Вы можете удалить данные из таблиц Iceberg V2 с помощью команды DELETE. Пример:

DELETE FROM default.impala_ice_test
WHERE txn_id = 1;
ПРИМЕЧАНИЕ
Операция DELETE поддерживается только для таблиц Iceberg V2. Попытка удаления строк из таблицы V1 приводит к ошибке.

Обновление данных

В Impala вы можете обновлять таблицы Iceberg V2 как показано в следующем примере.

UPDATE default.impala_ice_test
SET txn_value = txn_value + 100;
ПРИМЕЧАНИЕ
Операция UPDATE поддерживается только для таблиц Iceberg V2. Попытка обновления данных в таблице V1 приводит к ошибке.

Вы также можете использовать оператор UPDATE FROM для обновления целевой таблицы Iceberg на основе некой исходной таблицы (исходная таблица необязательно должна являться Iceberg-таблицей).

Пример:

UPDATE default.impala_ice_test
SET default.impala_ice_test.acc_id = src.acc_id,
    default.impala_ice_test.txn_date = src.txn_date,
FROM default.impala_ice_test, default.impala_ice_test_src src
WHERE default.impala_ice_test.txn_id = src.txn_internal_id;

Если в предложении WHERE есть несколько совпадений, Impala выдаст ошибку. Существует несколько ограничений на использование команды UPDATE FROM, например, поддержка единственного формата Parquet, проблемы с обновлением столбцов с партициями и т. д. Больше информации об ограничениях вы можете найти в документации Impala.

Time travel

Iceberg поддерживают функцию time travel, которая позволяет запрашивать данные из определенного снепшота таблицы, созданного в прошлом, и на который можно ссылаться по идентификатору или временной метке. Для выполнения time-travel запросов используйте предложение FOR SYSTEM_TIME AS OF <timestamp> и FOR SYSTEM_VERSION AS OF <snapshot-id>. Ниже приведены несколько примеров использования.

В следующем примере запрашиваются данные из ближайшего снепшота, который старше указанной временной метки:

SELECT * FROM default.impala_ice_test
FOR SYSTEM_TIME AS OF '2024-07-02 12:00:00';

Вывод:

+--------+--------+-----------+------------+
| txn_id | acc_id | txn_value | txn_date   |
+--------+--------+-----------+------------+
| 2      | 1002   | 63.5      | 2024-02-04 |
| 1      | 1001   | 110.0     | 2023-01-01 |
+--------+--------+-----------+------------+

В следующем запросе нужный снепшот определяется путем вычитания отрезка времени из текущего момента.

SELECT * FROM default.impala_ice_test
FOR SYSTEM_TIME AS OF now() - interval 1 minute;

Вывод:

+--------+--------+-----------+------------+
| txn_id | acc_id | txn_value | txn_date   |
+--------+--------+-----------+------------+
| 2      | 1002   | 63.5      | 2024-02-04 |
+--------+--------+-----------+------------+

Следующий запрос получает данные из снепшота с указанием его ID:

SELECT * FROM default.impala_ice_test
FOR SYSTEM_VERSION AS OF 7308000224696874146;

Результат:

+--------+--------+-----------+------------+
| txn_id | acc_id | txn_value | txn_date   |
+--------+--------+-----------+------------+
| 1      | 1001   | 10.0      | 2023-01-01 |
+--------+--------+-----------+------------+

Чтобы получить информацию о снепшотах, доступных для конкретной таблицы, используйте команду DESCRIBE HISTORY, как показано в следующем примере:

DESCRIBE HISTORY default.impala_ice_test;

Результат выполнения команды:

+-------------------------------+---------------------+---------------------+---------------------+
| creation_time                 | snapshot_id         | parent_id           | is_current_ancestor |
+-------------------------------+---------------------+---------------------+---------------------+
| 2024-04-07 21:41:56.959000000 | 7308000224696874146 | NULL                | TRUE                |
| 2024-04-07 21:42:19.537000000 | 3739750708916322181 | 7308000224696874146 | TRUE                |
| 2024-04-07 22:04:58.577000000 | 3634103131974849338 | 3739750708916322181 | TRUE                |
+-------------------------------+---------------------+---------------------+---------------------+

Roll back

При каждом изменении содержимого Iceberg-таблицы Iceberg создает снепшот для этой таблицы. С помощью снепшотов вы можете откатить состояние таблицы к некоторой версии в прошлом, обозначенной идентификатором снепшота. При откате таблицы создается новый снепшот с тем же идентификатором, но с новой временной меткой создания. Используя оператор ALTER TABLE <tbl_name> EXECUTE ROLLBACK, вы можете откатить таблицу к предыдущим версиям, как показано ниже.

Например, предположим, что существует таблица Iceberg со следующим содержимым:

+--------+--------+-----------+------------+
| txn_id | acc_id | txn_value | txn_date   |
+--------+--------+-----------+------------+
| 2      | 1002   | 63.5      | 2024-02-04 |
| 1      | 1001   | 110.0     | 2023-01-01 |
+--------+--------+-----------+------------+

Следующая команда откатывает состояние таблицы до снепшота, обозначенного ID:

ALTER TABLE default.impala_ice_test
EXECUTE ROLLBACK(7308000224696874146);

После выполнения этой команды выборка из таблицы с помощью SELECT возвращает данные, которые хранились в таблице в момент создания указанного снепшота. Например:

+--------+--------+-----------+------------+
| txn_id | acc_id | txn_value | txn_date   |
+--------+--------+-----------+------------+
| 1      | 1001   | 10.0      | 2023-01-01 |
+--------+--------+-----------+------------+

Следующая команда откатывает таблицу до версии снепшота, который был создан раньше указанной временной метки:

ALTER TABLE default.impala_ice_test
EXECUTE ROLLBACK('2024-07-05 12:00:00');

По умолчанию Iceberg накапливает снепшоты, пока они не будут удалены пользователем. Вы можете удалить ненужные снепшоты с помощью команды ALTER TABLE …​ EXECUTE expire_snapshots(<timestamp>).

Примеры:

ALTER TABLE default.impala_ice_test
EXECUTE expire_snapshots('2024-07-05 12:00:00');
ALTER TABLE default.impala_ice_test
EXECUTE expire_snapshots(now() - interval 10 days);

Конвертация типов данных Iceberg

В следующей таблице описано сопоставление типов данных Iceberg и типов SQL в Impala.

Тип данных Iceberg Тип SQL в Impala

boolean

BOOLEAN

int

INTEGER

long

BIGINT

float

FLOAT

double

DOUBLE

decimal(P, S)

DECIMAL(P, S)

date

DATE

time

 — 

timestamp

TIMESTAMP

timestamptz

Поддержка чтения с использованием TIMESTAMP

string

STRING

uuid

 — 

fixed(L)

 — 

binary

 — 

struct

STRUCT (только чтение)

list

ARRAY (только чтение)

map

MAP (только чтение)

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней