Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Belangrijk
Deze functie bevindt zich in openbare preview in Databricks Runtime 15.4 LTS en hoger.
Met tabellen waarvoor typeverbreiding is ingeschakeld, kunt u kolomgegevenstypen wijzigen in een breder type zonder onderliggende gegevensbestanden opnieuw te schrijven. U kunt kolomtypen handmatig wijzigen of schemaontwikkeling gebruiken om kolomtypen te ontwikkelen.
Belangrijk
Type-uitbreiding is beschikbaar in Databricks Runtime 15.4 LTS en hoger. Tabellen waarvoor type widening is ingeschakeld, kunnen alleen worden gelezen in Databricks Runtime 15.4 LTS en hoger.
Voor type widening is Delta Lake vereist. Alle beheerde tabellen van Unity Catalog maken standaard gebruik van Delta Lake.
Ondersteunde typewijzigingen
U kunt typen breder maken op basis van de volgende regels:
| Brontype | Ondersteunde uitgebreidere typen |
|---|---|
byte |
short
int, long, decimaldouble |
short |
int,long,decimal,double |
int |
long, , decimaldouble |
long |
decimal |
float |
double |
decimal |
decimal met meer precisie en schaal |
date |
timestampNTZ |
Om te voorkomen dat geheel getalwaarden per ongeluk worden gepromoot naar decimalen, moet u handmatig typewijzigingen doorvoeren vanbyte, shortof intnaar long of decimaldouble. Bij het promoveren van een geheel getaltype naar decimal of double, als een downstreamopname deze waarde terugschrijft naar een kolom met gehele getallen, wordt het breukgedeelte van de waarden standaard afgekapt door Spark.
Notitie
Wanneer u een numeriek type wijzigt in decimal, moet de totale precisie gelijk zijn aan of groter zijn dan de beginprecisie. Als u ook de schaal verhoogt, moet de totale precisie met een corresponderend bedrag toenemen.
Het minimumdoel voor byte, shorten int typen is decimal(10,0). Het minimumdoel voor long is decimal(20,0).
Als u twee decimalen wilt toevoegen aan een veld met decimal(10,1), is het minimumdoel decimal(12,3).
Typewijzigingen worden ondersteund voor kolommen en velden op het hoogste niveau die zijn genest in structs, kaarten en matrices.
Typebreiding inschakelen
U kunt type-uitbreiding inschakelen voor een bestaande tabel door de delta.enableTypeWidening tabeleigenschap in te stellen op true:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'true')
U kunt ook typebreiding inschakelen tijdens het maken van een tabel:
CREATE TABLE T(c1 INT) TBLPROPERTIES('delta.enableTypeWidening' = 'true')
Belangrijk
Wanneer u typebreiding inschakelt, wordt de tabelfunctie typeWideningingesteld, waarmee de lezer- en schrijfprotocollen worden bijgewerkt. U moet Databricks Runtime 15.4 of hoger gebruiken om te kunnen communiceren met tabellen waarvoor type widening is ingeschakeld. Als externe clients ook met de tabel werken, controleert u of deze tabelfunctie wordt ondersteund. Bekijk de compatibiliteit en protocollen van Delta Lake-functies.
Handmatig een typewijziging toepassen
Gebruik de ALTER COLUMN opdracht om typen handmatig te wijzigen:
ALTER TABLE <table_name> ALTER COLUMN <col_name> TYPE <new_type>
Met deze bewerking wordt het tabelschema bijgewerkt zonder de onderliggende gegevensbestanden opnieuw te schrijven.
Breid typen uit met automatische schema-evolutie
Schemaontwikkeling werkt met type widening om gegevenstypen in doeltabellen bij te werken zodat deze overeenkomen met het type binnenkomende gegevens.
Notitie
Zonder dat type-verbreding is ingeschakeld, probeert schema-evolutie altijd gegevens te downcasten om overeen te komen met kolomtypen in de doel-tabel. Als u gegevenstypen niet automatisch wilt breder maken in uw doeltabellen, schakelt u typebreedheid uit voordat u workloads uitvoert waarvoor schemaontwikkeling is ingeschakeld.
Als u schemaontwikkeling wilt gebruiken om het gegevenstype van een kolom tijdens opname te verbreed, moet u aan de volgende voorwaarden voldoen:
- De schrijfopdracht wordt uitgevoerd met automatische schemaontwikkeling ingeschakeld.
- De doeltabel heeft 'type widening' (datatype-uitbreiding) ingeschakeld.
- Het bronkolomtype is breder dan het doelkolomtype.
- Type-uitbreiding ondersteunt de verandering van het type.
- De typewijziging is niet een van
byte,short,int, oflongnaardecimalofdouble. Deze typewijzigingen kunnen alleen handmatig met ALTER TABLE worden toegepast om onbedoelde omzetting van gehele getallen naar decimalen te voorkomen.
Typemismatches die niet aan al deze voorwaarden voldoen, volgen de normale schema-afdwingingsregels. Zie Schemahandhaving.
De functie voor het uitbreiden van de tabeltype uitschakelen
U kunt onbedoelde typebreiding voor ingeschakelde tabellen voorkomen door de eigenschap in te stellen op false:
ALTER TABLE <table_name> SET TBLPROPERTIES ('delta.enableTypeWidening' = 'false')
Met deze instelling voorkomt u toekomstige wijzigingen in de tabel, maar verwijdert u de functie voor het breder maken van de tabel niet of verwijdert u de typen die zijn gewijzigd.
Als u de tabelfuncties voor het breder maken van het type volledig wilt verwijderen, kunt u de DROP FEATURE opdracht gebruiken, zoals wordt weergegeven in het volgende voorbeeld:
ALTER TABLE <table-name> DROP FEATURE 'typeWidening' [TRUNCATE HISTORY]
Notitie
In plaats daarvan moeten tabellen die type-uitbreiding inschakelen met behulp van Databricks Runtime 15.4 LTS de functie typeWidening-preview verwijderen.
Wanneer u het verbreden van het type beëindigt, worden alle gegevensbestanden die niet voldoen aan het huidige tabelschema herschreven. Zie Een Delta Lake-tabelfunctie verwijderen en het tabelprotocol degraderen.
Streamen vanuit een Delta-tabel
Notitie
Ondersteuning voor Type Widening in Structured Streaming is beschikbaar in Databricks Runtime 16.3 en hoger.
Bij het streamen vanuit een Delta-tabel worden typewijzigingen behandeld als niet-additieve schemawijzigingen, vergelijkbaar met het wijzigen of verwijderen van een kolom met kolomtoewijzing.
U kunt een locatie voor schematracking opgeven om streaming vanuit Delta Lake-tabellen in te schakelen met een typewijziging die is toegepast.
Elke streaming-lezing van een gegevensbron moet zijn eigen schemaTrackingLocation hebben. De opgegeven schemaTrackingLocation moet zijn opgenomen in de map die is opgegeven voor de checkpointLocation doeltabel voor streaming-schrijfbewerkingen.
Notitie
Voor streamingworkloads die gegevens uit meerdere Delta-brontabellen combineren, moet u unieke mappen opgeven in de checkpointLocation voor elke brontabel.
De optie schemaTrackingLocation wordt gebruikt om het pad voor schematracering op te geven, zoals wordt weergegeven in het volgende codevoorbeeld:
Python
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
Nadat u een locatie voor schematracking hebt opgegeven, zal de stream het bijgehouden schema ontwikkelen wanneer een typewijziging wordt gedetecteerd en vervolgens stopt. Op dat moment kunt u alle benodigde acties ondernemen om de wijziging van het type af te handelen, zoals het inschakelen van het breder maken van typen in de downstreamtabel of het bijwerken van de streamingquery.
Als u de verwerking wilt hervatten, stelt u de Spark-configuratie spark.databricks.delta.streaming.allowSourceColumnTypeChange of de DataFrame-lezeroptie allowSourceColumnTypeChange in.
Python
checkpoint_path = "/path/to/checkpointLocation"
(spark.readStream
.option("schemaTrackingLocation", checkpoint_path)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
# alternatively to allow all future type changes for this stream:
# .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpoint_path)
.toTable("output_table")
)
Scala
val checkpointPath = "/path/to/checkpointLocation"
spark.readStream
.option("schemaTrackingLocation", checkpointPath)
.option("allowSourceColumnTypeChange", "<delta_source_table_version>")
// alternatively to allow all future type changes for this stream:
// .option("allowSourceColumnTypeChange", "always")
.table("delta_source_table")
.writeStream
.option("checkpointLocation", checkpointPath)
.toTable("output_table")
SQL
-- To unblock for this particular stream just for this series of schema change(s):
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange.ckpt_<checkpoint_id> = "<delta_source_table_version>"
-- To unblock for this particular stream:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "<delta_source_table_version>"
-- To unblock for all streams:
SET spark.databricks.delta.streaming.allowSourceColumnTypeChange = "always"
De controlepunt-id <checkpoint_id> en de versie van de Delta Lake-brontabel <delta_source_table_version> worden weergegeven in het foutbericht wanneer de stream stopt.
Delta Delen
Notitie
Ondersteuning voor Type Widening in Delta Sharing is beschikbaar in Databricks Runtime 16.1 en hoger.
Het delen van een Delta Lake-tabel waarvoor type widening is ingeschakeld, wordt ondersteund in Databricks-to-Databricks Delta Sharing. De provider en ontvanger moeten zich in Databricks Runtime 16.1 of hoger bevindt.
Als u Wijzigingengegevensfeed wilt lezen uit een Delta Lake-tabel waarvoor typeverruiming is ingeschakeld met Delta Sharing, moet u het responsformaat instellen op delta:
spark.read
.format("deltaSharing")
.option("responseFormat", "delta")
.option("readChangeFeed", "true")
.option("startingVersion", "<start version>")
.option("endingVersion", "<end version>")
.load("<table>")
Het lezen van wijzigingenfeed voor verschillende typen wijzigingen wordt niet ondersteund. In plaats daarvan moet u de bewerking splitsen in twee afzonderlijke leesbewerkingen, één die eindigt op de tabelversie met de typewijziging en de andere vanaf de versie die de typewijziging bevat.
Beperkingen
Apache Iceberg-compatibiliteit
Apache Iceberg biedt geen ondersteuning voor alle typewijzigingen die worden gedekt door typebreiding. Zie Iceberg Schema Evolution. Azure Databricks biedt met name geen ondersteuning voor de volgende typewijzigingen:
-
byte,short,int,longnaardecimalofdouble - Toename van de decimale schaal
-
datetot en mettimestampNTZ
Wanneer UniForm met Iceberg-compatibiliteit is ingeschakeld voor een Delta Lake-tabel, resulteert het toepassen van een van deze typen wijzigingen in een fout.
Als u een van deze niet-ondersteunde typewijzigingen toepast op een Delta Lake-tabel, resulteert het inschakelen van Uniform met Iceberg-compatibiliteit in de tabel tot een fout. Als u de fout wilt oplossen, moet u de functie voor het breder maken van de tabel typen verwijderen.
Andere beperkingen
- Het bieden van een schematraceringslocatie met behulp van SQL bij het streamen vanuit een Delta Lake-tabel met een typewijziging wordt niet ondersteund.
- Het delen van een tabel met Delta Sharing met type widening ingeschakeld voor niet-Databricks-consumenten wordt niet ondersteund.