配置模式推理和進化自動加載程序
您可以配置自動加載程序加載數據的自動檢測模式,允許您初始化表沒有顯式地聲明數據模式和發展介紹了新列的表模式。這消除了需要手動跟蹤和應用模式會隨著時間而改變。
自動加載器也可以意想不到的“救援”數據(例如,不同的數據類型)在一個JSON blob列,您可以選擇訪問後使用半結構化數據訪問api。
支持以下格式模式推理和演化:
文件格式 |
支持版本 |
---|---|
|
磚運行時8.2及以上 |
|
磚運行時8.3及以上 |
|
磚運行時10.2及以上 |
|
磚運行時11.1及以上 |
|
不支持的 |
|
不適用(fixed-schema) |
|
不適用(fixed-schema) |
語法模式推理和演化
指定目標目錄的選項cloudFiles.schemaLocation
使模式推理和演化。你可以選擇使用你指定相同的目錄中checkpointLocation
。如果你使用三角洲生活表,磚自動管理模式位置和其他檢查點信息。
請注意
如果你有一個以上的源數據位置被加載到目標表,每個汽車裝載機攝入工作負載需要一個單獨的流檢查點。
下麵的示例使用拚花
為cloudFiles.format
。使用csv
,avro
,或json
其他文件來源。所有其他設置讀寫保持不變每個格式的默認行為。
(火花。readStream。格式(“cloudFiles”)。選項(“cloudFiles.format”,“鋪”)#模式位置目錄跟蹤你的數據模式。選項(“cloudFiles.schemaLocation”,“< path-to-checkpoint >”)。負載(“< path-to-source-data >”)。writeStream。選項(“checkpointLocation”,“< path-to-checkpoint >”)。開始(“< path_to_target”))
火花。readStream。格式(“cloudFiles”)。選項(“cloudFiles.format”,“鋪”)/ /數據的模式位置目錄跟蹤模式。選項(“cloudFiles.schemaLocation”,“< path-to-checkpoint >”)。負載(“< path-to-source-data >”)。writeStream。選項(“checkpointLocation”,“< path-to-checkpoint >”)。開始(“< path_to_target”)
自動加載程序模式推理是如何工作的呢?
推斷模式首先讀取數據時,自動加載器樣品第一個50 GB或1000個文件,它發現,無論限製是越過第一。自動加載程序將模式信息存儲在一個目錄_schemas
在配置cloudfFiles.schemaLocation
跟蹤模式輸入數據隨著時間的變化。
請注意
改變大小的樣本你可以設置使用SQL配置:
火花。磚。cloudFiles。schemaInference。sampleSize。numBytes
例如,(字節字符串10 gb
)
和
火花。磚。cloudFiles。schemaInference。sampleSize。numFiles
(整數)
默認情況下,自動加載程序模式推理尋求避免模式演化問題由於類型不匹配。格式不編碼數據類型(JSON和CSV),自動裝載機推斷所有列作為字符串(包括嵌套的JSON文件中的字段)。格式的輸入模式(拚花和Avro),自動加載器樣品的文件和一個子集合並單個文件的模式。這種行為是總結在下表中:
文件格式 |
默認的數據類型 |
---|---|
|
字符串 |
|
字符串 |
|
在Avro模式類型編碼 |
|
類型編碼在鋪模式 |
Apache火花DataFrameReader使用不同的行為模式推理,選擇數據類型列JSON和CSV基於樣本數據的來源。使這種行為與自動加載程序,設置選項cloudFiles.inferColumnTypes
來真正的
。
請注意
為CSV數據推斷模式時,自動加載程序假定文件包含頭文件。如果你的CSV文件不包含頭文件,提供的選項.option(“頭”,“假”)
。此外,自動加載程序合並中的所有文件的模式樣本想出一個全球模式。自動加載程序可以讀取每個文件根據其頭和解析CSV正確。
請注意
當一個列有不同的數據類型在兩個拚花文件,自動加載器嚐試向上的
一種類型。如果向上轉型是不可能的,數據推理失敗。看到以下表為例:
1型 |
2型 |
向上的類型 |
---|---|---|
|
|
|
|
|
|
|
|
推理失敗 |
合並後的數據類型推斷,文件包含記錄加載未經選擇的類型的獲救的數據列推斷,因為數據類型不同的模式。
自動加載程序模式演化是如何工作的呢?
自動加載器檢測添加新列,因為它處理您的數據。當汽車加載程序檢測到一個新列,與一個流停止UnknownFieldException
。在你流拋出這個錯誤,自動加載程序上執行模式推理的最新micro-batch數據和更新最新的模式位置模式通過合並新列的模式。現有的列的數據類型不變。
磚建議配置自動加載程序流工作流這樣的模式變化後自動重新啟動。
自動加載程序支持以下模式演化模式,你在選項中設置cloudFiles.schemaEvolutionMode
:
模式 |
行為閱讀新列 |
---|---|
|
流失敗。新列添加到模式。現有的列不進化數據類型。 |
|
模式是沒有進化和流不失敗由於模式變化。記錄在所有新列獲救的數據列。 |
|
流失敗。流不重啟,除非提供的更新模式,或違規數據文件被刪除。 |
|
忽略不進化的模式,新列,和數據不是獲救,除非 |
分區使用自動加載程序如何?
自動加載程序試圖推斷出分區列從底層數據,如果數據的目錄結構是在蜂巢風格劃分。例如,文件路徑base_path /事件= = 2021-04-01 / f0.json點擊/日期
推理的結果日期
和事件
分區列。如果底層的目錄結構包含矛盾的蜂巢分區或不包含蜂巢風格分區,分區列將被忽略。
二進製文件(binaryFile
),文本
文件格式有固定的數據模式,但支持分區列推理。磚建議設置cloudFiles.schemaLocation
這些文件格式。這避免了任何潛在的錯誤或信息丟失,防止推理分區列每一次汽車加載程序就開始了。
分區列不考慮模式演化。如果你有一個初始目錄結構base_path /事件= = 2021-04-01 / f0.json點擊/日期
,然後開始接收新文件base_path /事件=點擊/日期= 1 / f1.json = 2021-04-01 /小時
、自動加載程序忽略了小時列。為新的分區列來捕捉信息,設置cloudFiles.partitionColumns
來事件、日期、小時
。
請注意
的選項cloudFiles.partitionColumns
需要一個以逗號分隔的列名。隻列存在鍵=值
對你的目錄結構解析。
獲救的數據列是什麼?
當汽車裝載機推斷模式,救出了數據列是自動添加到您的模式_rescued_data
。您可以重命名列或包括在這種情況下,你提供了一個模式通過設置選項rescuedDataColumn
。
獲救的數據列確保列模式不匹配的拯救,而不是下降。獲救的數據列不包含任何數據分析有以下原因:
列是失蹤的模式。
類型不匹配。
不匹配。
獲救的列包含獲救的JSON數據列和源文件路徑的記錄。
請注意
JSON解析記錄時和CSV解析器支持三種模式:寬容的
,DROPMALFORMED
,FAILFAST
。一起使用時rescuedDataColumn
、數據類型不匹配不導致記錄被刪除DROPMALFORMED
模式或拋出一個錯誤FAILFAST
模式。隻有腐敗記錄下降或拋出錯誤,如不完整或畸形的JSON或CSV。如果你使用badRecordsPath
當解析JSON或CSV數據類型不匹配,不能被視為壞記錄時使用rescuedDataColumn
。隻有不完整的和畸形的JSON或CSV記錄存儲在badRecordsPath
。
改變大小寫敏感的行為
除非啟用區分大小寫,列美國廣播公司
,美國廣播公司
,美國廣播公司
被認為是相同的列模式推理的目的。的選擇是任意的,取決於采樣數據。您可以使用模式提示執行這種情況下應該使用。一旦選擇了和模式推斷,自動加載程序沒有考慮套管變異沒有選擇與模式一致。
當獲救的數據列啟用,字段中指定其他比裝載模式_rescued_data
列。改變這種行為通過設置選項readerCaseSensitive
錯誤,在這種情況下,以不區分大小寫的方式自動加載器讀取數據。
覆蓋模式推理與提示
您可以使用模式提示執行模式信息,你知道,並期望在一個推斷模式。當你知道一個特定的數據類型的列,或者如果你想選擇一個更一般的數據類型(例如,一個雙
而不是一個整數
),您可以提供任意數量的提示對列數據類型為字符串使用SQL模式規範的語法,如以下:
。選項(“cloudFiles.schemaHints”,“標簽map < string, string >,版本int”)
看文檔數據類型支持的數據類型列表。
如果一列不存在的流,您還可以使用模式暗示這一列添加到推斷模式。
這裏是一個例子,一個推斷模式的行為模式提示。
推斷模式:
| - - -日期:字符串|——數量:int |——user_info:結構| | - id:字符串| | -名稱:字符串| |——羅伯特:字符串|——purchase_options:結構| |——delivery_address:字符串
通過指定以下模式提示:
。選項(“cloudFiles.schemaHints”,”user_info日期日期。捐贈日期、purchase_options MAP < STRING, STRING >,時間戳”)
你會得到:
| - - -日期:字符串- >日期|——數量:int |——user_info:結構| | - id:字符串| | -名稱:字符串| |——羅伯特:字符串- >日期|——purchase_options:結構- > map < string, string > |——時間:時間戳
請注意
數組和地圖模式提示支持磚運行時9.1 LTS及以上。
這裏的一個例子是一個推斷模式和複雜的數據類型的行為模式提示。
推斷模式:
| - - -產品:數組<字符串> |——地點:數組<字符串> |——用戶:數組< struct > | |——用戶。元素:結構| | | - id:字符串| | | -名稱:字符串| | |——羅伯特:字符串| - id: map < string, string > |——名字:map < string, string > |——價格:map < string, string > |——折扣:map <結構、字符串> | | -折扣。關鍵:結構| | | - id:字符串| | -折扣。值:字符串|——描述:map < string, struct > | | - - -描述。關鍵:字符串| | - - -描述。價值:結構| | | -內容:int
通過指定以下模式提示:
。選項(“cloudFiles.schemaHints”,”產品數組< INT >,位置。元素字符串,users.element。INT id, id MAP < STRING, INT >,名字。關鍵的INT,價格。INT值,discounts.key。id INT, descriptions.value。內容字符串”)
你會得到:
| - - -產品:數組<字符串> - >組< int > |——地點:數組< int > - >組<字符串> |——用戶:數組< struct > | |——用戶。元素:結構| | | - id:字符串- > int | | | -名稱:字符串| | |——羅伯特:字符串| - id: map < string, string > - > map < string, int > |——名字:地圖<字符串,字符串> - > < int,字符串> |——價格:map < string, string > - > map < string, int > |——折扣:map <結構、字符串> | | -折扣。關鍵:結構| | | - id:字符串- > int | | -折扣。值:字符串|——描述:map < string, struct > | | - - -描述。關鍵:字符串| | - - -描述。價值:結構| | | -內容:int - >字符串
請注意
隻有當你使用模式提示不提供一個模式來自動加載程序。提示是否可以使用模式cloudFiles.inferColumnTypes
啟用或禁用。