Todos os produtos
Search
Central de documentação

MaxCompute:Atualizar dados em colunas específicas

Última atualização: Jun 26, 2026

Gravar em uma tabela larga coluna por coluna gera alto custo quando cada INSERT ou UPDATE precisa especificar todas as colunas. A atualização parcial de colunas elimina essa restrição: especifique apenas as colunas a modificar e o MaxCompute processa o restante automaticamente, conforme o tipo de operação.

Como funciona

O comportamento das colunas não especificadas varia conforme a operação:

Operação

Colunas não especificadas

INSERT INTO / INSERT OVERWRITE

Definidas como NULL

UPDATE

Mantidas sem alteração

MERGE INTO (WHEN MATCHED UPDATE SET)

Mantidas sem alteração

MERGE INTO (WHEN NOT MATCHED INSERT)

Definidas como NULL

Essa distinção é fundamental: o INSERT preenche as colunas ausentes com NULL, enquanto o UPDATE e o WHEN MATCHED as mantêm intactas.

Casos de uso

O caso de uso mais comum é a construção de tabelas largas a partir de um esquema estrela. Quando várias tabelas de origem compartilham a mesma chave primária, grave as colunas de cada tabela na tabela larga de forma independente e paralela. Durante a leitura, o MaxCompute mescla as linhas pela chave primária e retorna registros completos. Comparada à gravação de todas as colunas em uma única operação, essa abordagem melhora o desempenho de leitura e gravação e reduz os custos de armazenamento.

Pré-requisitos

Antes de começar, verifique se você tem:

  • Uma tabela Delta com atualização parcial de colunas ativada (consulte Criar uma tabela Delta)

  • Familiaridade com instruções DML do MaxCompute: INSERT INTO, UPDATE, DELETE e MERGE INTO

Criar uma tabela Delta

Para ativar a atualização parcial de colunas, defina duas propriedades ao criar a tabela:

CREATE TABLE delta_target
(
    key  BIGINT NOT NULL PRIMARY KEY,
    b    STRING,
    c    BIGINT
)
TBLPROPERTIES (
    "acid.partial.fields.update.enable" = "true",
    "transactional" = "true"
);

Defina tanto acid.partial.fields.update.enable quanto transactional como "true". O recurso suporta tabelas particionadas e não particionadas.

Inserir dados em colunas específicas

Use INSERT INTO para gravar valores em um subconjunto de colunas. As colunas omitidas na lista são definidas como NULL. Ao inserir uma linha com chave primária existente, o MaxCompute atualiza apenas as colunas especificadas e mantém as demais inalteradas. Isso funciona efetivamente como uma atualização parcial via inserção.

Exemplo 1: Inserir uma nova linha, omitindo a coluna c

A coluna c não está listada; portanto, assume o valor NULL.

INSERT INTO TABLE delta_target(key, b) VALUES(1, '1');

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 1          | NULL       |
+------------+------------+------------+

Exemplo 2: Inserir uma linha com chave primária duplicada para atualizar uma coluna específica

Já existe uma linha com key=1. A inserção com a mesma chave primária atualiza a coluna especificada (c) e mantém a coluna não especificada (b) inalterada.

INSERT INTO TABLE delta_target(key, c) VALUES(1, 1);

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 1          | 1          |
+------------+------------+------------+

Exemplo 3: Atualizar outra coluna mantendo c inalterada

Como a coluna c não está listada, ela mantém seu valor atual de 1.

INSERT INTO TABLE delta_target(key, b) VALUES(1, '11');

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 1          | 11         | 1          |
+------------+------------+------------+

Exemplo 4: Inserir uma linha com uma nova chave primária

Se a chave primária ainda não existir, o sistema insere uma nova linha.

INSERT INTO TABLE delta_target VALUES(2, '2', 2);

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 2          | 2          |
| 1          | 11         | 1          |
+------------+------------+------------+

Para mais informações, consulte Inserir dados ou sobrescrever dados em uma tabela ou partição estática (INSERT INTO e INSERT OVERWRITE).

Atualizar colunas específicas em linhas existentes

Use UPDATE para modificar colunas específicas nas linhas correspondentes. As colunas não listadas na cláusula SET permanecem inalteradas.

Exemplo 1: Atualizar a coluna b para key=1, mantendo c inalterada

UPDATE delta_target SET b='111' WHERE key=1;

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 2          | 2          |
| 1          | 111        | 1          |
+------------+------------+------------+

Exemplo 2: Atualizar a coluna b para key=2, mantendo c inalterada

UPDATE delta_target SET b='222' WHERE key=2;

SELECT * FROM delta_target;

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 2          | 222        | 2          |
| 1          | 111        | 1          |
+------------+------------+------------+

Para mais informações, consulte UPDATE e DELETE.

Mesclar dados de source em colunas específicas

Use MERGE INTO para fazer upsert de dados visando apenas colunas específicas. Na cláusula WHEN MATCHED, somente as colunas listadas são atualizadas; as demais permanecem inalteradas. Já na cláusula WHEN NOT MATCHED, as colunas não listadas assumem o valor NULL.

O exemplo a seguir cria uma tabela de source e a mescla em delta_target. A mesclagem atualiza a coluna b para linhas correspondentes e insere (key, b) para novas linhas. A coluna c não é gravada em nenhum dos casos.

-- Create a source table with six rows
CREATE TABLE acid2_dml_pu_source AS
SELECT key, b, c
FROM VALUES
    (1, '10', 10),
    (2, '20', 20),
    (3, '30', 30),
    (4, '40', 40),
    (5, '50', 50),
    (6, '60', 60) t (key, b, c);

-- Merge: update b for matching rows, insert (key, b) for new rows
MERGE INTO delta_target AS t
USING acid2_dml_pu_source AS s ON s.key = t.key
WHEN MATCHED THEN
    UPDATE SET t.b = s.b
WHEN NOT MATCHED THEN
    INSERT (key, b) VALUES(s.key, s.b);

Resultado:

+------------+------------+------------+
| key        | b          | c          |
+------------+------------+------------+
| 3          | 30         | NULL       |
| 4          | 40         | NULL       |
| 5          | 50         | NULL       |
| 6          | 60         | NULL       |
| 2          | 20         | 2          |
| 1          | 10         | 1          |
+------------+------------+------------+

As linhas 3–6 são novas inserções: a coluna c é NULL porque não foi especificada. As linhas 1 e 2 foram correspondidas: a coluna b foi atualizada e c manteve seu valor anterior.

Para mais informações, consulte MERGE INTO.

Próximos passos