Spark SQL prend en charge Hudi depuis la version 0.8.0 d'EMR Hudi. Vous pouvez ainsi interroger et modifier des tables Hudi avec du SQL standard, sans écrire de code Spark DataFrame. Cette fonctionnalité réduit considérablement les coûts d'utilisation de Hudi et facilite son adoption sur EMR, notamment si votre équipe privilégie les workflows SQL aux API DataFrame.
Limites
La lecture et l'écriture Hudi via Spark SQL nécessitent l'une des versions de cluster EMR suivantes :
EMR V3.36.0 ou une version mineure ultérieure
EMR V5.2.0 ou une version mineure ultérieure
Démarrer Spark SQL
Les indicateurs de démarrage requis dépendent de vos versions de Spark et de Hudi. Identifiez votre configuration dans le tableau ci-dessous avant d'exécuter la commande de démarrage.
| Version de Spark | Version de Hudi | **Indicateurs --conf requis** |
|---|---|---|
| Spark 2 ou Spark 3 | Antérieure à 0.11 | spark.serializer, spark.sql.extensions |
| Spark 3 | 0.11 ou ultérieure | spark.serializer, spark.sql.extensions, spark.sql.catalog.spark_catalog |
Spark 2 ou Spark 3, Hudi antérieure à 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 ultérieure :
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'
Exemples
Les exemples suivants détaillent le cycle de vie complet d'une table Hudi : création, inspection, écriture et interrogation.
Créer une table
CREATE TABLE h0 (
id BIGINT,
name STRING,
price DOUBLE,
ts LONG
) USING hudi
TBLPROPERTIES (
primaryKey="id",
preCombineField="ts"
);
primaryKeyidentifie de manière unique chaque enregistrement de la table. Hudi l'utilise pour l'indexation et les recherches lors des opérations upsert.preCombineFieldest le champ de tri, généralement un horodatage d'événement. Hudi l'utilise pour résoudre les conflits lorsque plusieurs versions du même enregistrement existent.
Inspecter le schéma de la table
DESC FORMATTED h0;
Sortie attendue :
_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
Hudi ajoute automatiquement cinq champs de métadonnées préfixés par
_hoodie_
à chaque table. Ces champs suivent l'historique des validations, l'identité des enregistrements, l'emplacement des partitions et les informations sur les fichiers. Ils prennent en charge les fonctionnalités d'indexation et d'interrogation incrémentielle de Hudi.
Insérer des données
INSERT INTO h0 VALUES (1, 'a1', 10, 1000), (2, 'a2', 11, 1000);
Mettre à jour des données
UPDATE h0 SET name = 'a1_new' WHERE id = 1;
Supprimer des données
DELETE FROM h0 WHERE id = 1;
Interroger des données
Après les opérations d'insertion, de mise à jour et de suppression ci-dessus, interrogez la table pour confirmer les résultats.
Interroger des colonnes spécifiques :
SELECT id, name, price, ts FROM h0;
Sortie attendue :
2 a2 11.0 1000
Interroger toutes les colonnes (y compris les champs de métadonnées) :
SELECT * FROM h0;
Sortie attendue :
4.820221130150621338 20221130150621338_0_1 id:2 40d6507e-0579-42ce-a10f-c5e07a3981e5-0_0-29-2007_2022113015062****.parquet 2 a2 11.0 1000
Il s'agit d'une table non partitionnée, donc
_hoodie_partition_path
est vide. Les quatre premières valeurs de la sortie correspondent aux champs de métadonnées de Hudi.