O EMR Hudi 0.8.0 introduziu suporte ao Spark SQL, o que permite consultar e modifique tabelas Hudi com SQL padrão, sem código Spark DataFrame. Esse recurso reduz significativamente os custos de uso do Hudi e oferece um ponto de entrada mais acessível no EMR, sendo ideal para equipes que preferem fluxos de trabalho baseados em SQL em vez de APIs DataFrame.
Limitações
A leitura e escrita no Hudi via Spark SQL exigem uma das seguintes versões de cluster EMR:
EMR V3.36.0 ou versão secundária posterior
EMR V5.2.0 ou versão secundária posterior
Iniciar o Spark SQL
As flags de inicialização necessárias variam conforme as versões do Spark e do Hudi. Consulte a tabela abaixo para identificar sua configuração antes de executar o comando de inicialização.
|
Versão do Spark |
Versão do Hudi |
**Flags |
|
Spark 2 ou Spark 3 |
Anterior à 0.11 |
|
|
Spark 3 |
0.11 ou posterior |
|
Spark 2 ou Spark 3, Hudi anterior à 0.11:
spark-sql \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension'
Spark 3, Hudi 0.11 ou posterior:
spark-sql \
--conf 'spark.serializer=org.apache.spark.serializer.KryoSerializer' \
--conf 'spark.sql.extensions=org.apache.spark.sql.hudi.HoodieSparkSessionExtension' \
--conf 'spark.sql.catalog.spark_catalog=org.apache.spark.sql.hudi.catalog.HoodieCatalog'
Exemplos
Os exemplos a seguir demonstram o ciclo de vida completo de uma tabela Hudi: crie, inspeção, escrita e consulta.
Crie uma tabela
CREATE TABLE h0 (
id BIGINT,
name STRING,
price DOUBLE,
ts LONG
) USING hudi
TBLPROPERTIES (
primaryKey="id",
preCombineField="ts"
);
primaryKeyidentifica exclusivamente cada registro na tabela. O Hudi utiliza esse campo para indexação e buscas de upsert.preCombineFieldé o campo de ordenação (geralmente um timestamp de evento) usado pelo Hudi para resolver conflitos quando existem várias versões do mesmo registro.
Inspecionar o schema da tabela
DESC FORMATTED h0;
Saída esperada:
_hoodie_commit_time string
_hoodie_commit_seqno string
_hoodie_record_key string
_hoodie_partition_path string
_hoodie_file_name string
id bigint
name string
price double
ts bigint
O Hudi adiciona automaticamente cinco campos de metadados com o prefixo
_hoodie_
a todas as tabelas. Esses campos rastreiam o histórico de commits, a identidade do registro, a localização da partição e informações do arquivo, oferecendo suporte aos recursos de indexação e consulta incremental do Hudi.
Inserir dados
INSERT INTO h0 VALUES (1, 'a1', 10, 1000), (2, 'a2', 11, 1000);
Atualize dados
UPDATE h0 SET name = 'a1_new' WHERE id = 1;
Exclua dados
DELETE FROM h0 WHERE id = 1;
Consultar dados
Após as operações de inserção, atualize e exclua acima, consulte a tabela para confirme os resultados.
Consultar colunas específicas:
SELECT id, name, price, ts FROM h0;
Saída esperada:
2 a2 11.0 1000
Consultar todas as colunas (incluindo campos de metadados):
SELECT * FROM h0;
Saída esperada:
4.820221130150621338 20221130150621338_0_1 id:2 40d6507e-0579-42ce-a10f-c5e07a3981e5-0_0-29-2007_2022113015062****.parquet 2 a2 11.0 1000
Esta é uma tabela não particionada, portanto
_hoodie_partition_path
está em branco. Os quatro primeiros valores na saída correspondem aos campos de metadados do Hudi.