Todos os produtos
Search
Central de documentação

E-MapReduce:Use Iceberg

Última atualização: Jul 20, 2026

O Iceberg é um formato de tabela aberto para data lakes. Com ele, você constrói rapidamente um service de armazenamento de data lake no Hadoop Distributed File System (HDFS) ou no Alibaba Cloud Object Storage Service (OSS). Este tópico descreve como ler e gravar tabelas Iceberg no EMR Serverless Spark.

Pré-requisitos

Crie um workspace. Create a workspace.

Procedimento

Nota

Tanto o SparkSQL quanto os notebooks permitem leitura e gravação em tabelas Iceberg. O exemplo a seguir utiliza um job SparkSQL.

Etapa 1: Criar um recurso de sessão

  1. Acesse a página Sessions.

    1. Faça logon no console EMR.

    2. No painel de navegação à esquerda, escolha EMR Serverless > Spark.

    3. Na página Spark, clique em nome do workspace desejado.

    4. Na página EMR Serverless Spark, clique em Sessions no painel de navegação à esquerda.

  2. Na página SQL Session, clique em Connect to SQL Session.

  3. Na página Connect to SQL Session, configure os parâmetros abaixo na seção Spark Configuration e clique em Create. Para mais informações, consulte Manage SQL sessions.

    O Spark lê e grava tabelas Iceberg por meio de um catalog. Escolha um catalog conforme seu caso de uso. Para mais detalhes sobre catalogs, consulte Manage data catalogs.

    Data catalog

    Ao utilizar um data catalog, não é necessário configurar parâmetros na sessão. Na página Catalog, clique em Add Catalog. Em seguida, selecione o data catalog diretamente no ambiente de desenvolvimento SparkSQL.

    Nota
    • Para acessar o Iceberg no DLF (anteriormente DLF 2.5), utilize a versão do mecanismo esr-4.7.0, esr-3.6.0 ou superior.

    • Para acessar o Iceberg no DLF 1.0 (anteriormente DLF-Legacy) ou Hive Metastore, utilize a versão do mecanismo esr-4.3.0, esr-3.3.0, esr-2.7.0 ou superior.

    Custom catalog

    DLF (formerly DLF 2.5)

    Nota

    Requisito de versão do mecanismo: esr-4.7.0, esr-3.6.0 ou superior.

    spark.sql.extensions org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
    spark.sql.catalog.iceberg_catalog org.apache.iceberg.spark.SparkCatalog
    spark.sql.catalog.iceberg_catalog.catalog-impl org.apache.iceberg.rest.RESTCatalog
    spark.sql.catalog.iceberg_catalog.uri http://<regionID>-vpc.dlf.aliyuncs.com
    spark.sql.catalog.iceberg_catalog.warehouse  <catalog_name>
    spark.sql.catalog.iceberg_catalog.io-impl org.apache.iceberg.rest.DlfFileIO
    spark.sql.catalog.iceberg_catalog.rest.auth.type sigv4
    spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-type none
    spark.sql.catalog.iceberg_catalog.rest.signing-region <regionID>
    spark.sql.catalog.iceberg_catalog.rest.signing-name DlfNext
    spark.sql.catalog.iceberg_catalog.rest.access-key-id <access_key_id>
    spark.sql.catalog.iceberg_catalog.rest.secret-access-key <access_key_secret>

    A tabela a seguir descreve os parâmetros.

    Parâmetro

    Descrição

    Valor de exemplo

    spark.sql.extensions

    Ativa as extensões Spark do Iceberg.

    Valor fixo: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.iceberg_catalog

    Registra um catalog Spark chamado iceberg_catalog.

    Valor fixo: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.iceberg_catalog.catalog-impl

    Define a implementação subjacente do catalog como o catalog REST do Iceberg.

    org.apache.iceberg.rest.RESTCatalog

    spark.sql.catalog.iceberg_catalog.uri

    Endpoint da API REST para o service DLF Iceberg. O formato é http://<regionID>-vpc.dlf.aliyuncs.com.

    http://cn-hangzhou-vpc.dlf.aliyuncs.com

    spark.sql.catalog.iceberg_catalog.warehouse

    Nome do catalog DLF associado.

    Nota

    Não associe um catalog DLF criado a partir de um compartilhamento de dados.

    <catalog_name>

    spark.sql.catalog.iceberg_catalog.io-impl

    Utiliza a implementação FileIO personalizada do DLF.

    Valor fixo: org.apache.iceberg.rest.DlfFileIO

    spark.sql.catalog.iceberg_catalog.rest.auth.type

    Habilita o mecanismo de assinatura AWS Signature Version 4 (SigV4) para autenticar requisições REST.

    sigv4

    spark.sql.catalog.iceberg_catalog.rest.auth.sigv4.delegate-auth-type

    Desativa a autenticação delegada. O cliente deve fornecer um AccessKey ID e AccessKey Secret para assinar as requisições.

    none

    spark.sql.catalog.iceberg_catalog.rest.signing-region

    Região utilizada para assinatura. Este valor deve corresponder à região onde o service DLF está implantado.

    cn-hangzhou

    spark.sql.catalog.iceberg_catalog.rest.signing-name

    Nome do service usado para assinatura.

    Valor fixo: DlfNext

    spark.sql.catalog.iceberg_catalog.rest.access-key-id

    AccessKey ID da sua conta Alibaba Cloud ou usuário RAM.

    <access_key_id>

    spark.sql.catalog.iceberg_catalog.rest.secret-access-key

    AccessKey Secret da sua conta Alibaba Cloud ou usuário RAM.

    <access_key_secret>

    DLF 1.0 (formerly DLF-Legacy)

    Nota

    Requisito de versão do mecanismo: esr-4.3.0, esr-3.3.0, esr-2.7.0 ou superior.

    Os metadados são armazenados no DLF 1.0 (anteriormente DLF-Legacy).

    spark.sql.extensions                          org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
    spark.sql.catalog.<catalogName>               org.apache.iceberg.spark.SparkCatalog
    spark.sql.catalog.<catalogName>.catalog-impl  org.apache.iceberg.aliyun.dlf.hive.DlfCatalog
    spark.sql.catalog.<catalogName>.dlf.catalog.id <catalog_name>

    A tabela a seguir descreve os parâmetros.

    Parâmetro

    Descrição

    Valor de exemplo

    spark.sql.extensions

    Ativa as extensões Spark do Iceberg.

    Valor fixo: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Registra um catalog chamado <catalogName>.

    Valor fixo: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.catalog-impl

    Especifica a implementação compatível com Hive do Alibaba Cloud DLF 1.0, que se conecta ao service de metadados do DLF 1.0.

    Valor fixo: org.apache.iceberg.aliyun.dlf.hive.DlfCatalog

    spark.sql.catalog.<catalogName>.dlf.catalog.id

    Define o nome do catalog DLF associado.

    <catalog_name>

    Hive Metastore

    Os metadados ficam armazenados em um Hive Metastore específico.

    spark.sql.extensions                          org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
    spark.sql.catalog.<catalogName>               org.apache.iceberg.spark.SparkCatalog
    spark.sql.catalog.<catalogName>.catalog-impl  org.apache.iceberg.hive.HiveCatalog
    spark.sql.catalog.<catalogName>.uri           thrift://<yourHMSUri>:<port>

    A tabela a seguir descreve os parâmetros.

    Parâmetro

    Descrição

    Valor de exemplo

    spark.sql.extensions

    Ativa as extensões Spark do Iceberg.

    Valor fixo: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Registra um catalog chamado <catalogName>.

    Valor fixo: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.catalog-impl

    Indica que o catalog usa a implementação oficial HiveCatalog do Iceberg para gerenciar metadados no Hive Metastore.

    Valor fixo: org.apache.iceberg.hive.HiveCatalog

    spark.sql.catalog.<catalogName>.uri

    URI do Hive Metastore. O formato é thrift://<Hive metastore IP address>:9083.

    <Hive metastore IP address> corresponde ao endereço IP interno do service HMS. Caso precise especificar um service de metastore externo, consulte Connect to an external Hive Metastore Service.

    thrift://192.168.**.**:9083

    File system

    Os metadados residem em um sistema de arquivos.

    spark.sql.extensions                          org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions
    spark.sql.catalog.<catalogName>               org.apache.iceberg.spark.SparkCatalog
    spark.sql.catalog.<catalogName>.type          hadoop
    spark.sql.catalog.<catalogName>.warehouse     oss://<yourBucketName>/warehouse

    A tabela a seguir descreve os parâmetros.

    Parâmetro

    Descrição

    Valor de exemplo

    spark.sql.extensions

    Ativa as extensões Spark do Iceberg.

    Valor fixo: org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions

    spark.sql.catalog.<catalogName>

    Registra um catalog chamado <catalogName>.

    Valor fixo: org.apache.iceberg.spark.SparkCatalog

    spark.sql.catalog.<catalogName>.type

    Define o tipo de catalog como hadoop. O HadoopCatalog armazena metadados diretamente no sistema de arquivos, sem exigir um Hive Metastore.

    hadoop

    spark.sql.catalog.<catalogName>.warehouse

    Especifica o caminho para armazenamento de metadados. Neste caminho, <yourBucketName> representa o nome do bucket OSS.

    oss://<yourBucketName>/warehouse

Etapa 2: Ler e gravar tabelas Iceberg****

  1. Acesse a página Data Development.

    Na página EMR Serverless Spark, clique em Development no painel de navegação à esquerda.

  2. Na aba Development, clique em ícone image.

  3. Na caixa de diálogo Create, insira um nome como users_task, mantenha o Type como SparkSQL (padrão) e clique em OK.

  4. Copie o código abaixo para a nova aba SparkSQL (users_task).

    Nota

    Se nenhum banco de dados for especificado, a tabela será criada no banco default do catalog. Também é possível criar e indicar um banco de dados diferente.

    -- Create a database.
    CREATE DATABASE IF NOT EXISTS iceberg_catalog.db;
    -- Create a non-partitioned table.
    CREATE TABLE iceberg_catalog.db.tbl (
        id BIGINT NOT NULL COMMENT 'unique id',
        data STRING
    )
    USING iceberg;
    -- Insert data into the non-partitioned table.
    INSERT INTO iceberg_catalog.db.tbl VALUES
    (1, 'Alice'),
    (2, 'Bob'),
    (3, 'Charlie');
    -- Query all data from the non-partitioned table.
    SELECT * FROM iceberg_catalog.db.tbl;
    -- Query the non-partitioned table with a condition.
    SELECT * FROM iceberg_catalog.db.tbl WHERE id = 2;
    -- Update data in the non-partitioned table.
    UPDATE iceberg_catalog.db.tbl SET data = 'David' WHERE id = 3;
    -- Query again to confirm the update.
    SELECT * FROM iceberg_catalog.db.tbl WHERE id = 3;
    -- Delete data from the non-partitioned table.
    DELETE FROM iceberg_catalog.db.tbl WHERE id = 1;
    -- Query again to confirm the deletion.
    SELECT * FROM iceberg_catalog.db.tbl;
    -- Create a partitioned table.
    CREATE TABLE iceberg_catalog.db.part_tbl (
        id BIGINT,
        data STRING,
        category STRING,
        ts TIMESTAMP,
        dt DATE
    )
    USING iceberg
    PARTITIONED BY (dt, category);
    -- Insert data into the partitioned table.
    INSERT INTO iceberg_catalog.db.part_tbl VALUES
      (1 , 'data-01', 'A', timestamp'2026-01-01 10:00:00', date'2026-01-01'),
      (2 , 'data-02', 'A', timestamp'2026-01-01 11:00:00', date'2026-01-01'),
      (3 , 'data-03', 'A', timestamp'2026-01-02 09:30:00', date'2026-01-02'),
      (4 , 'data-04', 'B', timestamp'2026-01-02 12:15:00', date'2026-01-02'),
      (5 , 'data-05', 'B', timestamp'2026-01-03 08:05:00', date'2026-01-03'),
      (6 , 'data-06', 'B', timestamp'2026-01-03 14:20:00', date'2026-01-03'),
      (7 , 'data-07', 'C', timestamp'2026-01-04 16:45:00', date'2026-01-04'),
      (8 , 'data-08', 'C', timestamp'2026-01-04 18:10:00', date'2026-01-04'),
      (9 , 'data-09', 'C', timestamp'2026-01-05 07:55:00', date'2026-01-05'),
      (10, 'data-10', 'A', timestamp'2026-01-05 13:35:00', date'2026-01-05');
    -- Query all data from the partitioned table.
    SELECT * FROM iceberg_catalog.db.part_tbl;
    -- Query data from the partition where dt='2026-01-01'.
    SELECT * FROM iceberg_catalog.db.part_tbl WHERE dt='2026-01-01';
    -- Query data for a specific category.
    SELECT * FROM iceberg_catalog.db.part_tbl WHERE category = 'A';
    -- Perform a query with multiple conditions (day + category).
    SELECT * FROM iceberg_catalog.db.part_tbl 
    WHERE dt='2026-01-01'
      AND category = 'A';
    -- Aggregate and count the number of records in each category.
    SELECT category, COUNT(*) AS count 
    FROM iceberg_catalog.db.part_tbl 
    GROUP BY category;
    -- Drop the database (use with caution). Before you drop the database, make sure that it contains no tables.
    -- DROP DATABASE iceberg_catalog.db;
  5. Na lista suspensa de sessões, selecione a instância de sessão SQL criada e clique em Execute. Após a conclusão da consulta de agregação, a saída exibirá: categoria B (3), categoria C (3) e categoria A (4).

Referências