Élargissement automatique du type avec Auto Loader
Aperçu
Cette fonctionnalité est en Aperçu public dans Databricks Runtime 16.4 et versions ultérieures.
Auto Loader traite de manière incrémentielle et efficace les nouveaux fichiers de données à mesure qu'ils arrivent dans le stockage cloud. Il réduit également la maintenance des pipelines en gérant automatiquement les modifications de schéma complexes. Par exemple, vous pouvez configurer Auto Loader pour détecter automatiquement le schéma des données chargées, ce qui vous permet d'initialiser les tables sans déclarer explicitement le schéma de données. Vous pouvez également faire évoluer le schéma de table à mesure que de nouvelles colonnes sont introduites, éliminant ainsi la nécessité de suivre et d'appliquer manuellement les modifications de schéma au fil du temps. Auto Loader peut même récupérer des données inattendues (par exemple, en raison de types de données différents) dans une colonne de données récupérées, ce qui vous aide à éviter la perte de données.
Cependant, la colonne de données récupérées exige que vous traitiez manuellement toute modification de type de données.
Pour gérer automatiquement certains de ces changements de type de données, utilisez l'élargissement de type dans Auto Loader. Delta Lake prend désormais en charge différentes modifications d'élargissement de type de données sans nécessiter de réécriture de données ou d'intervention de l'utilisateur. Voir Delta Lake Élargissement de type. Le nouveau mode pour l'évolution des schémas, addNewColumnsWithTypeWidening, fait automatiquement évoluer le schéma en cas de modifications de type de données compatibles.
Vous pouvez élargir les types primitifs comme int à long, float à double, et plus encore. L'élargissement de type est disponible pour tous les formats de fichier avec prise en charge de l'évolution des schémas dans Auto Loader. Cela inclut les formats texte (comme JSON, CSV ou XML) et les formats binaires (comme Avro ou Parquet). Il n’y a aucun changement dans le comportement d’évolution des schémas pour les modes d’évolution des schémas existants (tels que addNewColumns, rescue, failOnNewColumns ou none).
Modifications de type prises en charge
Les changements de type suivants sont pris en charge :
Type de source | Types plus larges pris en charge |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Lors de l'élargissement de tout type numérique à decimal, Auto Loader s'élargit à decimal avec une précision égale ou supérieure à la précision de départ. Si vous augmentez l'échelle, la précision totale augmente d'une quantité correspondante.
La précision de départ des types d'entiers est la suivante :
Type | Précision de départ. |
|---|---|
|
|
|
|
|
|
|
|
Par exemple, si le type actuel d'une colonne est int et qu'un fichier dont le type de colonne est decimal(5, 2) est lu, Auto Loader étend le type de cette colonne à decimal(12, 2).
Prérequis
Pour utiliser l'élargissement de type avec Auto Loader, vous devez satisfaire aux exigences suivantes :
- Utilisez Databricks Runtime 16.4 ou une version ultérieure.
- Si le récepteur d'écriture est une table Delta Lake, activez l'élargissement de type pour la table Delta Lake en utilisant l'une des méthodes suivantes :
-
Si vous utilisez une table existante :
SQLALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true') -
Si vous créez une nouvelle table avec l'élargissement de type activé :
SQLCREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
-
Pour plus d'informations sur l'élargissement de type dans les tables Delta Lake, consultez Élargissement de type.
Activer l'élargissement de type avec l'évolution des schémas
Pour utiliser l’élargissement de type avec Auto Loader, spécifiez addNewColumnsWithTypeWidening lors de l’utilisation de l’évolution des schémas. Auto Loader détecte l’ajout de nouvelles colonnes et les modifications de type au fur et à mesure qu’il traite vos données.
- Python
- Scala
query = (spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "csv")
.option("cloudFiles.inferColumnTypes", True)
.option("cloudFiles.schemaLocation", <schemaPath>)
.option("cloudFiles.schemaEvolutionMode", "addNewColumnsWithTypeWidening")
.load(<inputPath>)
.writeStream
.option("mergeSchema", "true")
.option("checkpointLocation", <checkpointPath>)
.trigger(availableNow=True)
.toTable("table_name")
)
val query = spark.readStream
.format("cloudFiles")
.option("cloudFiles.format", "csv")
.option("cloudFiles.inferColumnTypes", true)
.option("cloudFiles.schemaLocation", <schemaPath>)
.option("cloudFiles.schemaEvolutionMode", "addNewColumnsWithTypeWidening")
.load(<inputPath>)
.writeStream
.option("mergeSchema", "true")
.option("checkpointLocation", <checkpointPath>)
.trigger(Trigger.AvailableNow())
.toTable("table_name")
Lorsque Auto Loader détecte une nouvelle colonne ou un changement de type pris en charge par l'élargissement de type, le Stream s'arrête avec un UnknownFieldException. Avant que votre Stream ne génère cette erreur, Auto Loader effectue une inférence de schéma sur le dernier micro-lot de données et met à jour l'emplacement du schéma avec le dernier schéma en élargissant les colonnes existantes ou en fusionnant de nouvelles colonnes à la fin du schéma.
Comportement d'évolution des schémas sur les modifications de type de données
Si vous deviez ingérer un CSV avec le contenu suivant, Auto Loader inférerait le schéma comme STRUCT<id INT, name STRING, _rescued_data STRING>.
id, name
1, John
2, Mary
La table cible se présente comme suit :
| id | name | _rescued_data | | -- | ---- | --------------- | | 1 | John | NULL | | 2 | Mary | NULL |
Maintenant, ingérez un autre fichier CSV où les valeurs de la colonne id sont plus larges que le type INT :
id, name, age
2147483648, Bob, 25
Le tableau suivant explique le comportement et le résultat avec différents modes d'évolution des schémas dans Auto Loader :
Mode | Comportement avec le changement de type de données extensible pris en charge |
|---|---|
| Le type de données n'évolue pas, et le Stream n'échoue pas en raison d'un changement de type de données. Les colonnes avec des valeurs dont les types ne correspondent pas sont définies sur |
| Le schéma n’évolue pas et les streams n’échouent pas en raison de modifications du schéma. Les colonnes avec des valeurs dont le type ne correspond pas sont définies sur |
| Le type de données n'évolue pas, et le Stream n'échoue pas en raison d'un changement de type de données. Les colonnes avec des valeurs dont les types ne correspondent pas sont définies sur |
| Ne fait pas évoluer le schéma, les nouvelles colonnes sont ignorées et les données ne sont pas récupérées à moins que l'option |
| Le Stream échoue. De nouvelles colonnes sont ajoutées au schéma, et les modifications de type de données prises en charge sont élargies. Les modifications de type de données non prises en charge (par exemple, de |
Résultats d'exemple
Les sections suivantes présentent le schéma inféré et les valeurs pour chaque mode d'évolution des schémas après l'ingestion du second fichier CSV.
addNewColumns
Schéma : id: INT, name: STRING, age: INT, _rescued_data: STRING
ID | Nom | âge | _rescued_data |
|---|---|---|---|
1 | John | NULL | NULL |
2 | Mary | NULL | NULL |
NULL | Bob | 25 |
|
rescue
Schéma : id: INT, name: STRING, _rescued_data: STRING
ID | Nom | _rescued_data |
|---|---|---|
1 | John | NUL |
2 | Mary | NULL |
NULL | Bob |
|
failOnNewColumns
Schéma : id: IN_data: STRING
ID | Nom | _rescued_data |
|---|---|---|
1 | John | NULL |
2 | Mary | NULL |
NULL | Bob |
|
none
Schéma : `id: IN`
ID | Nom |
|---|---|
1 | John |
2 | Mary |
NULL | Bob |
addNewColumnsWithTypeWidening
Schéma : id: BIGINT, name: STRING, age: INT, _rescued_data: STRING
ID | Nom | âge | _rescued_data |
|---|---|---|---|
1 | John | NULL | NULL |
2 | Mary | NULL | NULL |
2 147 483 648 | Bob | 25 | NULL |
Limitations
- L’option
prefersDecimalne peut pas être définie surfalselors de l’utilisation deaddNewColumnsWithTypeWidening. LorsqueaddNewColumnsWithTypeWideningest spécifié, la valeur par default deprefersDecimalesttrue. datel’élargissement àtimestampNTZn’est pris en charge que pour les fichiers Parquet.