O conector Iceberg permite consultar e gravar dados em tabelas Apache Iceberg usando Trino no EMR. O Iceberg é um formato de tabela aberto para data lakes que oferece suporte a transações ACID, evolução de particionamento e viagem no tempo baseada em snapshots.
Pré-requisitos
Antes de começar, verifique se você possui:
Um cluster DataLake ou Hadoop com o serviço Presto ativado. Consulte Criar um cluster.
Limitações
Apenas clusters DataLake e Hadoop executando EMR V3.38.0 ou posterior oferecem suporte ao conector Iceberg.
Caso tenha selecionado DLF Unified Metadata durante a criação do cluster, não será possível gravar dados em tabelas Iceberg.
Configure o conector Iceberg
Para obter o procedimento geral de modificação das configurações do conector, consulte Configurar conectores.
Configuração padrão
Faça logon no console EMR, acesse a aba Configure da página de serviço do Trino e clique em iceberg.properties. A aba exibe o item de configuração hive.metastore.uri, que especifica o URI do Hive Metastore acessível via protocolo Thrift. Modifique esse valor para corresponder ao seu ambiente.
Adicionar itens de configuração
Na aba Configure da página de serviço do Trino, clique em iceberg.properties e, em seguida, clique em Add Configuration Item.
|
Item de configuração |
Descrição |
Padrão |
|
|
Formato de arquivo para armazenar dados da tabela Iceberg. Valores válidos: |
|
|
|
Codec de compactação usado ao gravar arquivos. Valores válidos: |
|
|
|
Número máximo de partições que cada writer pode processar. |
|
Consultar tabelas Iceberg
Os passos a seguir demonstram como criar um schema e uma tabela, inserir dados e consultar resultados usando SQL padrão do Trino.
Pré-requisitos
Faça logon no seu cluster via SSH. Consulte Fazer logon em um cluster.
Conecte-se ao cliente Trino. Consulte Usar a CLI para conectar ao Trino.
Passos
-
Crie um schema:
CREATE SCHEMA iceberg.testdb; -
Crie uma tabela:
CREATE TABLE iceberg.testdb.iceberg_test (id INT); -
Insira dados:
INSERT INTO iceberg.testdb.iceberg_test VALUES (1), (2); -
Consulte a tabela:
SELECT * FROM iceberg.testdb.iceberg_test;Saída esperada:
id ---- 1 2
Sintaxe SQL
O conector Iceberg oferece suporte à leitura e gravação de dados e metadados em tabelas Iceberg. Além do SQL padrão, ele aceita as seguintes instruções:
|
Instrução |
Referência |
|
INSERT |
INSERT na documentação do Trino |
|
DELETE |
Excluir dados por partição neste tópico e DELETE na documentação do Trino |
|
Gerenciamento de schema e tabela |
Particionar uma tabela neste tópico e Schema and table management na documentação do Trino |
|
Gerenciamento de visualizações materializadas |
Gerenciar visualizações materializadas neste tópico e Materialized view management na documentação do Trino |
|
Gerenciamento de views |
View management na documentação do Trino |
Propriedades da tabela
Utilize a cláusula WITH para definir as seguintes propriedades ao criar uma tabela Iceberg:
|
Propriedade |
Descrição |
Padrão |
|
|
Formato de arquivo para armazenamento dos dados da tabela. Valores válidos: |
|
|
|
Colunas de chave de partição como um array. Por exemplo, |
— |
|
|
URI do sistema de arquivos que armazena a tabela. |
— |
Exemplo:
CREATE TABLE test_table (
c1 INTEGER,
c2 DATE,
c3 DOUBLE)
WITH (
format = 'PARQUET',
partitioning = ARRAY['c1', 'c2'],
location = '/var/my_tables/test_table');
Particionar uma tabela
O conector Iceberg suporta particionamento baseado em funções. Use as seguintes funções na propriedade partitioning:
|
Função |
Descrição |
|
|
Particiona por ano. Retorna o número de anos entre |
|
|
Particiona por mês. Retorna o número de meses entre |
|
|
Particiona por dia. Retorna o número de dias entre |
|
|
Particiona por hora. Retorna um timestamp truncado com as partes de minuto e segundo removidas. |
|
|
Particiona dados por hash no número especificado de buckets. Retorna o valor de hash de |
|
|
Retorna os primeiros |
Exemplo: Particione a tabela customer_orders por mês do pedido, hash do número da conta (10 buckets) e país:
CREATE TABLE iceberg.testdb.customer_orders (
order_id BIGINT,
order_date DATE,
account_number BIGINT,
customer VARCHAR,
country VARCHAR)
WITH (partitioning = ARRAY['month(order_date)', 'bucket(account_number, 10)', 'country']);
Excluir dados por partição
Em uma tabela particionada, se você incluir uma cláusula WHERE em uma instrução DELETE para filtrar partições, o conector Iceberg exclui as partições que correspondem às condições do filtro. Por exemplo, a instrução abaixo remove todas as partições onde country = 'US' da tabela customer_orders:
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US';
O conector Iceberg permite excluir dados apenas por partição. A execução da instrução a seguir falha porque a cláusula WHERE filtra linhas específicas dentro das partições, em vez de partições completas:
DELETE FROM iceberg.testdb.customer_orders
WHERE country = 'US' AND customer = 'Freds Foods';
Consultar tabelas do sistema
O conector Iceberg expõe tabelas do sistema que fornecem metadados sobre cada tabela Iceberg.
Consultar partições — inclui os valores mínimo e máximo para cada coluna de chave de partição:
SELECT * FROM iceberg.testdb."customer_orders$partitions";
Consultar snapshots — lista todos os snapshots com seus timestamps de commit:
SELECT * FROM iceberg.testdb."customer_orders$snapshots"
ORDER BY committed_at DESC;
Reverter para um snapshot
Tabelas Iceberg suportam snapshots. O conector Iceberg fornece uma tabela de snapshot do sistema para cada tabela Iceberg. Os IDs de snapshot são do tipo de dados BIGINT.
Para reverter uma tabela a um estado anterior, obtenha primeiro o ID do snapshot alvo e depois chame o procedimento de rollback.
-
Obtenha o ID do snapshot mais recente:
SELECT snapshot_id FROM iceberg.testdb."customer_orders$snapshots" ORDER BY committed_at DESC LIMIT 1; -
Reverta para o snapshot:
CALL iceberg.system.rollback_to_snapshot('testdb', 'customer_orders', 895459706749342****);Substitua
895459706749342****pelo ID real do snapshot (um valor BIGINT).
Gerencie visualizações materializadas
Uma visualização materializada no conector Iceberg consiste em uma definição de view e uma tabela Iceberg subjacente. O nome da tabela é armazenado como uma propriedade da visualização materializada; os dados residem na tabela Iceberg.
|
Instrução |
Descrição |
|
Cria uma visualização materializada. Use a cláusula |
|
|
Atualiza a visualização materializada excluindo os dados da tabela subjacente e reinserindo os resultados da consulta. Esta instrução também serve para excluir a definição e a tabela Iceberg de uma visualização materializada. |
Existe uma pequena janela de tempo entre as operações de exclusão e inserção durante a atualização. Se a inserção falhar, a visualização materializada ficará vazia até a próxima atualização bem-sucedida.
Próximos passos
Visão geral — conheça os conceitos do Iceberg, incluindo snapshots, partições e versões de formato de tabela.
Configurar conectores — guia geral para modificar configurações de conectores no EMR.