Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
Az Automatikus betöltőt úgy konfigurálhatja, hogy automatikusan észlelje a betöltött adatok sémáját, így anélkül inicializálhatja a táblákat, hogy explicit módon deklarálja az adatsémát, és új oszlopok bevezetésekor fejleszti a táblázatsémát. Ez szükségtelenné teszi a sémamódosítások manuális nyomon követését és alkalmazását az idő függvényében.
Az automatikus betöltő egy JSON-bloboszlopban váratlanul (például eltérő adattípusokból) álló adatokat is "menthet", amelyeket később a félig strukturált adatelérési API-k használatával tekinthet meg.
Az Automatikus betöltő a következő formátumokat támogatja a sémakövetkeztetéshez és az evolúcióhoz:
| Fájlformátum | Támogatott verziók |
|---|---|
JSON |
Az összes verzió |
CSV |
Az összes verzió |
XML |
Databricks Runtime 14.3 LTS és újabb verziók |
Avro |
Databricks Runtime 10.4 LTS és újabb |
Parquet |
Databricks Runtime 11.3 LTS és újabb verziók |
ORC |
Nem támogatott |
Text |
Nem alkalmazható (rögzített séma) |
Binaryfile |
Nem alkalmazható (rögzített séma) |
Sémakövetkeztetés és -fejlesztés szintaxisa
A célkönyvtár megadása a cloudFiles.schemaLocation opcióhoz lehetővé teszi a sémaértelmezést és a fejlődést. Választhatja, hogy ugyanazt a könyvtárat használja, amelyet a checkpointLocation-hez megad.
Ha Lakeflow-folyamatokat használ, Azure Databricks automatikusan kezeli a séma helyét és egyéb ellenőrzőpont-információkat.
Feljegyzés
Ha egynél több forrásadathely van betöltve a céltáblába, minden automatikus betöltési számítási feladathoz külön streamelési ellenőrzőpont szükséges.
Az alábbi példa a parquet-t használja a cloudFiles.format céljára. Használjon csv, avrovagy json más fájlforrásokat. Minden más olvasási és írási beállítás változatlan marad az egyes formátumok alapértelmezett viselkedéséhez.
Python
(spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "parquet")
# The schema location directory keeps track of your data schema over time
.option("cloudFiles.schemaLocation", "<path-to-schema>")
.load("<path-to-source-data>")
.writeStream
.option("checkpointLocation", "<path-to-checkpoint>")
.start("<path-to-target>")
)
Scala
spark.readStream.format("cloudFiles")
.option("cloudFiles.format", "parquet")
// The schema location directory keeps track of your data schema over time
.option("cloudFiles.schemaLocation", "<path-to-schema>")
.load("<path-to-source-data>")
.writeStream
.option("checkpointLocation", "<path-to-checkpoint>")
.start("<path-to-target>")
Hogyan működik az Auto Loader séma-következtetése?
Az adatok első olvasásakor, a séma következtetésének érdekében, az Auto Loader az elsőként felderített 50 GB-ot vagy 1000 fájlt mintázza, aszerint, hogy melyik korlát teljesül először. Az Automatikus betöltő a sémaadatokat a konfigurált _schemas könyvtárban cloudFiles.schemaLocation tárolja a bemeneti adatok sémaváltozásainak nyomon követésére.
Feljegyzés
A használt minta méretének módosításához állítsa be az SQL-konfigurációkat:
spark.databricks.cloudFiles.schemaInference.sampleSize.numBytes
(bájtsztring, például 10gb)
és
spark.databricks.cloudFiles.schemaInference.sampleSize.numFiles
(egész szám)
Az automatikus betöltő sémakövetkeztetése alapértelmezés szerint a típuseltérések miatti sémafejlődési problémák elkerülésére törekszik. Olyan formátumok esetén, amelyek nem kódolnak adattípusokat (JSON, CSV és XML), az Automatikus betöltő az összes oszlopot sztringként (beleértve a JSON-fájlok beágyazott mezőit is) sztringként jelöli. A beírt sémával (Parquet és Avro) rendelkező formátumok esetében az Automatikus betöltő a fájlok egy részhalmazát mintázhatja, és egyesítheti az egyes fájlok sémáit. Az alábbi táblázat összefoglalja ezt a viselkedést.
| Fájlformátum | Alapértelmezett következtetett adattípus |
|---|---|
JSON |
Sztring |
CSV |
Sztring |
XML |
Sztring |
Avro |
Az Avro-sémában kódolt típusok |
Parquet |
Parquet-sémában kódolt típusok |
Az Apache Spark DataFrameReader eltérő viselkedést használ a sémakövetkeztetésekhez, és mintaadatok alapján választja ki a JSON-, CSV- és XML-források oszlopainak adattípusait. Ha engedélyezni szeretné ezt a viselkedést az Auto Loaderrel, állítsa be a cloudFiles.inferColumnTypes opciót true-re.
Feljegyzés
A CSV-adatok sémájának következtetésekor az Automatikus betöltő feltételezi, hogy a fájlok fejléceket tartalmaznak. Ha a CSV-fájlok nem tartalmaznak fejléceket, adja meg a lehetőséget .option("header", "false"). Az Automatikus betöltő emellett egyesíti a mintában szereplő összes fájl sémáját, hogy globális sémát állítson elő. Az automatikus betöltő ezután beolvassa az egyes fájlokat a fejléce alapján, és megfelelően elemzi a CSV-t.
Feljegyzés
Ha egy oszlop két Parquet-fájlban eltérő adattípussal rendelkezik, az Automatikus betöltő a legszélesebb típust választja. A schemaHints használatával felülbírálhatja ezt a választást. Ha sématippeket ad meg, az Automatikus betöltő nem a megadott típusra irányítja az oszlopot, hanem arra utasítja a Parquet-olvasót, hogy a megadott típusként olvassa be az oszlopot. Eltérés esetén az Automatikus betöltő úgy menti az oszlopot, hogy az adatokat a mentett adatoszlopba helyezi.
Hogyan működik az automatikus betöltő sémafejlődése?
Az Automatikus betöltő észleli az új oszlopok hozzáadását az adatok feldolgozása során. Amikor az Auto Loader új oszlopot észlel, a stream egy UnknownFieldExceptionhibakóddal leáll. Mielőtt a stream ezt a hibát észleli, az Automatikus betöltő sémakövetkeztetést hajt végre a legújabb mikro-adatkötegen, és frissíti a séma helyét a legújabb sémával az új oszlopoknak a séma végéhez való egyesítésével. A meglévő oszlopok adattípusai változatlanok maradnak.
A Databricks javasolja az automatikus betöltő streamek Lakeflow-feladatokkal való konfigurálását, hogy az automatikusan újrainduljon az ilyen sémamódosítások után.
Az Automatikus betöltő a sémafejlődés alábbi módjait támogatja, amelyeket a cloudFiles.schemaEvolutionMode beállításban állított be:
| Mód | Új oszlop olvasásának viselkedése |
|---|---|
addNewColumns (alapértelmezett) |
Az adatfolyam UnknownFieldException hibával leáll, miután az Auto Loader hozzáadja az új oszlopokat a sémához. A stream újraindítása a frissített sémával folytatja a feldolgozást. A meglévő oszlopok nem fejlesztik az adattípusokat. Az Azure Databricks azt javasolja, hogy az Auto Loader-adatfolyamokat Lakeflow Jobs használatával konfigurálja, hogy azok automatikusan újrainduljanak. |
addNewColumnsWithTypeWidening |
Ugyanaz a viselkedés, mint a addNewColumns esetében, de az Auto Loader a támogatott adattípusok körét is bővíti (például int-ről long-re). A nem támogatott típusmódosítások (például int-ról string-ra) a mentett adatok oszlopához lesznek hozzáadva. |
rescue |
Az Automatikus betöltő soha nem fejleszti ki a sémát, és a stream sémamódosítások miatt nem hiúsul meg. Az Automatikus betöltő a mentett adatoszlop összes új oszlopát rögzíti. |
failOnNewColumns |
A stream meghiúsul, és nem indul újra, hacsak nem frissíti a megadott sémát, vagy nem távolítja el a jogsértő adatfájlt. A séma nem frissül automatikusan. |
none |
Nem fejleszti a sémát, az új oszlopok figyelmen kívül lesznek hagyva, és az adatok mentése csak akkor történik meg, ha a rescuedDataColumn beállítás be van állítva. A stream nem hiúsul meg sémamódosítások miatt. |
Feljegyzés
addNewColumns üzemmód az alapértelmezett, ha nincs megadva séma, de a séma megadásakor none az alapértelmezett.
addNewColumns nem engedélyezett, ha a stream sémája meg van adva, de működik, ha a sémát sémamutatóként adja meg.
Az Automatikus betöltő a sémafejlődési móddal támogatja az addNewColumnsWithTypeWidening automatikus típusnövelést is. Ez a mód automatikusan kibővíti az adattípusokat (például int-ról long-re vagy float-ről double-ra) anélkül, hogy az adatokat át kellene írni vagy felhasználói beavatkozást igényelne. Ez a funkció nyilvános előzetes verzióban érhető el a Databricks Runtime 16.4-ben és újabb verziójában. Lásd Automatikus típus kiterjesztése az Automatikus betöltővel.
Hogyan működnek a partíciók az Automatikus betöltővel?
Az Automatikus betöltő megkísérel partícióoszlopokat kinyerni az adatok mögöttes könyvtárszerkezetéből, ha az adatok Hive-stílusú particionálásban találhatók. A fájl elérési útja base_path/event=click/date=2021-04-01/f0.json például az date és event mint partícióoszlopok következtetéseit eredményezi. Ha a mögöttes címtárstruktúra ütköző Hive-partíciókat tartalmaz, vagy nem tartalmaz Hive-stílusú particionálást, az Automatikus betöltő figyelmen kívül hagyja a partícióoszlopokat.
A bináris fájlok (binaryFile) és text a fájlformátumok rögzített adatsémákat tartalmaznak, de támogatják a partícióoszlopok következtetését. A Databricks javasolja ezeknek a fájlformátumoknak a beállítását cloudFiles.schemaLocation . Ezzel elkerülhetők a lehetséges hibák vagy információvesztések, és megakadályozza, hogy a partícióoszlopok következtetése megtörténjen minden alkalommal, amikor egy Auto Loader elindul.
Az automatikus betöltő nem veszi figyelembe a sémafejlődés partícióoszlopait. Ha volt egy kezdeti könyvtárstruktúra, például base_path/event=click/date=2021-04-01/f0.json, majd elkezd új fájlokat fogadni, base_path/event=click/date=2021-04-01/hour=01/f1.jsonaz Automatikus betöltő figyelmen kívül hagyja az óra oszlopot. Az új partícióoszlopok adatainak rögzítéséhez állítsa be a következőt cloudFiles.partitionColumnsevent,date,hour: .
Feljegyzés
A cloudFiles.partitionColumns beállítás az oszlopnevek vesszővel tagolt listáját használja. Az Automatikus Betöltő csak azokat az oszlopokat elemzi, amelyek a címtárstruktúrában párként key=value léteznek.
Mi a megmentett adat oszlop?
Amikor az Automatikus betöltő a sémára következtet, az Automatikus betöltő automatikusan hozzáad egy mentett adatoszlopot a sémához._rescued_data A(z) rescuedDataColumn opcióval átnevezheti az oszlopot, vagy belefoglalhatja azt, amikor megad egy sémát.
A mentett adatoszlop biztosítja, hogy az Auto Loader a sémával nem egyező oszlopokat mentse el, ahelyett, hogy elvetné őket. A mentett adatoszlop az alábbi okokból nem elemezhető adatokat tartalmaz:
- Az oszlop hiányzik a sémából.
- Típuseltérések.
- Kis- és nagybetűk eltérései.
A mentett adatoszlop egy JSON-blobot tartalmaz, amely tartalmazza a mentett oszlopokat és a rekord forrásfájljának elérési útját.
Feljegyzés
A JSON- és CSV-elemzők három módot támogatnak a rekordok elemzésekor: PERMISSIVE, DROPMALFORMEDés FAILFAST. Ha rescuedDataColumn-t együtt használják, az adattípus-eltérések nem okozzák az Automatikus Betöltőnek a DROPMALFORMED üzemmódban a rekordok elvetését, vagy hibát jeleznek a FAILFAST üzemmódban. Csak sérült rekordok sikertelenek vagy hibásak, például hiányos vagy hibásan formázott JSON- vagy CSV-rekordok. Ha a JSON vagy CSV elemzésekor badRecordsPath-t használ, az Auto Loader nem kezeli az adattípus-eltéréseket rossz rekordként, amikor rescuedDataColumn-t használ. Az Automatikus betöltő csak hiányos és hibásan formázott JSON- vagy CSV-rekordokat tárol a fájlban badRecordsPath.
A kis- és nagybetűk megkülönböztetett viselkedésének módosítása
Ha nincs engedélyezve a kis- és nagybetűk érzékenysége, az Automatikus betöltő a sémakövetkeztetés szempontjából figyelembe veszi az oszlopokatabcAbc, és ABC ugyanazt az oszlopot. Az Automatikus betöltő a mintaadatok alapján tetszőlegesen választja ki az esetet. Sématippekkel kényszerítheti ki, hogy melyik esetet kell használnia. Miután az Automatikus betöltő kiválasztotta és a sémára következtet, nem veszi figyelembe a nem a sémával konzisztensen kiválasztott burkolatvariánsokat.
Ha a visszaállított adatoszlop engedélyezve van, az Auto Loader betölti a sémától eltérő esetben elnevezett mezőket az _rescued_data oszlopba. Módosítsa ezt a viselkedést úgy, hogy a readerCaseSensitive beállítást false értékre állítja; ebben az esetben az Auto Loader kis- és nagybetűk érzékenységét figyelmen kívül hagyva olvassa be az adatokat.
Sémakövetkeztetés felülbírálása sématippekkel
Sématippekkel kikényszerítheti azokat a sémainformációkat, amelyeket egy következtetett sémában ismer és vár. Ha tudja, hogy egy oszlop egy adott adattípushoz tartozik, vagy ha általánosabb adattípust szeretne választani (például double egy helyett integer), tetszőleges számú tippet adhat meg az oszlop adattípusaihoz sztringként az SQL-séma specifikációjának szintaxisával, például az alábbiakkal:
.option("cloudFiles.schemaHints", "tags map<string,string>, version int")
A támogatott adattípusok listáját a Nyelvi leképezések című témakörben találja.
Ha egy oszlop nem található a stream elején, sématippekkel is hozzáadhatja az oszlopot a kikövetkeztetett sémához.
Az alábbi példa egy következtetett sémát és a sémamutatók alkalmazásának eredményét mutatja be.
Következtetett séma:
|-- date: string
|-- quantity: int
|-- user_info: struct
| |-- id: string
| |-- name: string
| |-- dob: string
|-- purchase_options: struct
| |-- delivery_address: string
A következő sémára vonatkozó jelzések megadásával:
.option("cloudFiles.schemaHints", "date DATE, user_info.dob DATE, purchase_options MAP<STRING,STRING>, time TIMESTAMP")
a következőt kapja:
|-- date: string -> date
|-- quantity: int
|-- user_info: struct
| |-- id: string
| |-- name: string
| |-- dob: string -> date
|-- purchase_options: struct -> map<string,string>
|-- time: timestamp
Feljegyzés
A tömb- és térképséma-tippek támogatása a Databricks Runtime 9.1 LTS-ben és újabb verziókban érhető el.
Az alábbi példa egy összetett adattípusokkal rendelkező, következtetett sémát és a sémamutatók alkalmazásának eredményét mutatja be.
Következtetett séma:
|-- products: array<string>
|-- locations: array<string>
|-- users: array<struct>
| |-- users.element: struct
| | |-- id: string
| | |-- name: string
| | |-- dob: string
|-- ids: map<string,string>
|-- names: map<string,string>
|-- prices: map<string,string>
|-- discounts: map<struct,string>
| |-- discounts.key: struct
| | |-- id: string
| |-- discounts.value: string
|-- descriptions: map<string,struct>
| |-- descriptions.key: string
| |-- descriptions.value: struct
| | |-- content: int
A következő sémára vonatkozó jelzések megadásával:
.option("cloudFiles.schemaHints", "products ARRAY<INT>, locations.element STRING, users.element.id INT, ids MAP<STRING,INT>, names.key INT, prices.value INT, discounts.key.id INT, descriptions.value.content STRING")
a következőt kapja:
|-- products: array<string> -> array<int>
|-- locations: array<int> -> array<string>
|-- users: array<struct>
| |-- users.element: struct
| | |-- id: string -> int
| | |-- name: string
| | |-- dob: string
|-- ids: map<string,string> -> map<string,int>
|-- names: map<string,string> -> map<int,string>
|-- prices: map<string,string> -> map<string,int>
|-- discounts: map<struct,string>
| |-- discounts.key: struct
| | |-- id: string -> int
| |-- discounts.value: string
|-- descriptions: map<string,struct>
| |-- descriptions.key: string
| |-- descriptions.value: struct
| | |-- content: int -> string
Feljegyzés
Az Automatikus betöltő csak akkor használ sématippeket, ha nem ad meg sémát. Használhat sématippeket, függetlenül attól, hogy engedélyezve vagy letiltva van-e cloudFiles.inferColumnTypes .