在 Azure Synapse 無服務器 SQL 池中,在通過 CSV 決議器使用 OPENROWSET 讀取 JSON 檔案時,我們必須將 FIELDTERMINATOR 和 FIELDQUOTE 指定為“0x0b”(垂直選項卡)。有人可以幫助了解原因嗎?
如果它是單行 JSON (JSONL),則檔案中的每一行都是一個 JSON 檔案,我希望將整行作為單個值讀取,并且不需要指定 FIELDTERMINATOR 或 FIELDQUOTE。
我們是否只是覆寫了欄位終止符的默認值是逗號 (,) 而欄位完全是雙引號 (")?如果是這樣,'0x0b' 的意義是什么?
檔案在這里 - https://docs.microsoft.com/en-us/azure/synapse-analytics/sql/query-json-files
檔案中的示例代碼如下
select top 10 *
from openrowset(
bulk 'https://pandemicdatalake.blob.core.windows.net/public/curated/covid-19/ecdc_cases/latest/ecdc_cases.jsonl',
format = 'csv',
fieldterminator ='0x0b',
fieldquote = '0x0b'
) with (doc nvarchar(max)) as rows
uj5u.com熱心網友回復:
是的,我們正在覆寫 csv 默認引數以與 json 兼容。這些引數使 Synapse 讀取文本檔案中的行并正確處理 json/jsonl 內容。以下是一些背景原因:
OPENROWSET 是為讀取多種檔案格式的檔案而創建的。Synapse serverless 當前支持 csv、parquet 和 delta(delta Lake)。OPENROWSET 不支持將 json 作為單獨的格式。由于 json 和 csv 都是相似的文本檔案,因此使用帶有合適引數的 csv 格式來讀取 json。實際上,在這種情況下,OPENROWSET 本身并不將檔案視為 json 或 jsonl。它將檔案視為具有一列和多行的 csv/文本檔案。接下來的步驟,例如 JSON_VALUE 或 OPENJSON,使 Synapse 將文本視為 json。
當您指定format='csv'fieldterminator 和 fieldquote 的默認值是逗號和雙引號時,就像您說的那樣。這些值在讀取 json 時會出現問題,因為您的 json 可以包含這些字符用于其他目的。這就是為什么在讀取 json 檔案時,您需要通過將它們設定為 json 不包含的某個值來使 openrowset 忽略欄位終止符和欄位引號。不幸的是 csv 格式沒有其他方法可以關閉它們。
字符 0x0b 是一個垂直制表符,現在很少使用。因此,使用此字符使 openrowset 忽略這些引數是一種常見的做法。您也可以使用其他字符,只要它們未在您的 json 中使用。可以在此處找到有關 VT 歷史記錄的更多資訊:什么是垂直選項卡?
您可以嘗試在 json 中包含 0x0b 字符,并查看它會引發 Synapse 錯誤“由于 CSV 資料檔案中的列值無效而導致批量加載失敗”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/420698.html
標籤:
