Gravar em uma tabela larga coluna por coluna é custoso quando cada INSERT ou UPDATE exige a especificação de todas as colunas. A atualização parcial de colunas remove essa restrição: especifique apenas as colunas que deseja modificar e o MaxCompute processa o restante automaticamente, conforme o tipo de operação.
Como funciona
O comportamento das colunas não especificadas depende da operação:
|
Operação |
Colunas não especificadas |
|
INSERT INTO / INSERT OVERWRITE |
Definidas como NULL |
|
UPDATE |
Mantidas inalteradas |
|
MERGE INTO (WHEN MATCHED UPDATE SET) |
Mantidas inalteradas |
|
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 source compartilham a mesma chave primária, grave as colunas de cada tabela source 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 Crie uma tabela Delta)
Familiaridade com instruções DML do MaxCompute: INSERT INTO, UPDATE, DELETE e MERGE INTO
Crie uma tabela Delta
Para ativar a atualização parcial de colunas, defina duas propriedades de tabela 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 ausentes na lista de colunas são definidas como NULL. Ao inserir uma linha com uma chave primária já 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, é definida como 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 obter mais informações, consulte Insert data into or overwrite data in a table or a static partition (INSERT INTO and 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 obter mais informações, consulte UPDATE and DELETE.
Mesclar dados 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. Na cláusula WHEN NOT MATCHED, as colunas não listadas são definidas como NULL.
O exemplo a seguir cria uma tabela 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 obter mais informações, consulte MERGE INTO.