本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
COPY 從JSON格式
JSON 資料結構由一組物件或陣列組成。JSON 物件以 braces 開頭和結尾,並包含未排序的名稱值對集合。每一個名稱和值以冒號分隔,而配對以逗號分隔。名稱是以雙引號括住的字串。引號字元必須是簡單引號 (0x22),而不是斜向或「智慧型」引號。
JSON 陣列以括號開頭和結尾,並包含以逗號分隔的有序值集合。值可以是雙引號中的字串、數字、布林值為 true 或 false、 null、JSON物件或陣列。
JSON 物件和陣列可以巢狀排列,啟用階層式資料結構。下列範例顯示具有兩個有效物件JSON的資料結構。
{ "id": 1006410, "title": "Amazon Redshift Database Developer Guide" } { "id": 100540, "name": "Amazon Simple Storage Service User Guide" }
以下顯示與兩個JSON陣列相同的資料。
[ 1006410, "Amazon Redshift Database Developer Guide" ] [ 100540, "Amazon Simple Storage Service User Guide" ]
COPY 的選項 JSON
您可以在COPY搭配使用 JSON 格式資料時指定下列選項:
-
'auto'
– COPY會自動從 JSON 檔案載入欄位。 -
'auto ignorecase'
– COPY會自動從JSON檔案載入欄位,同時忽略欄位名稱的案例。 -
s3://jsonpaths_file
– COPY使用 JSONPaths 檔案剖析JSON來源資料。JSONPaths 檔案是文字檔案,其中包含名稱與JSONPath表達式陣列"jsonpaths"
配對的單一JSON物件。如果名稱是 以外的任何字串"jsonpaths"
, COPY會使用'auto'
引數,而不是 檔案JSONPaths。
如需示範如何使用 'auto'
、 'auto ignorecase'
或 JSONPaths 檔案以及使用 JSON 物件或陣列載入資料的範例,請參閱 從JSON範例複製。
JSONPath 選項
在 Amazon Redshift COPY 語法中,JSONPath表達式會使用括號符號或點符號,指定JSON階層式資料結構中單一名稱元素的明確路徑。Amazon Redshift 不支援可能解析為不明確路徑或多個名稱JSONPath元素的任何元素,例如萬用字元或篩選條件表達式。因此,Amazon Redshift 無法剖析複雜、多層級的資料結構。
以下是使用括號表示法,具有JSONPath表達式JSONPaths的檔案範例。貨幣符號 ($) 代表根層級結構。
{ "jsonpaths": [ "$['id']", "$['store']['book']['title']", "$['location'][0]" ] }
在上述範例中,$['location'][0]
參考陣列的第一個元素。JSON 使用以零為基礎的陣列索引。陣列索引必須是正整數 (大於或等於零)。
下列範例顯示使用點符號的上一個JSONPaths檔案。
{ "jsonpaths": [ "$.id", "$.store.book.title", "$.location[0]" ] }
jsonpaths
陣列中不能混用方括號標記法和點標記法。方括號標記法和點標記法中都可以使用方括號來參考陣列元素。
使用點符號時,JSONPath運算式不能包含下列字元:
-
一般單引號 ( ' )
-
句點,或點 ( . )
-
方括號 ( [ ] ),除非用來參考陣列元素
如果JSONPath運算式所參考之名稱值對中的值是物件或陣列,則整個物件或陣列會載入為字串,包括括號或括號。例如,假設JSON您的資料包含下列物件。
{ "id": 0, "guid": "84512477-fa49-456b-b407-581d0d851c3c", "isActive": true, "tags": [ "nisi", "culpa", "ad", "amet", "voluptate", "reprehenderit", "veniam" ], "friends": [ { "id": 0, "name": "Martha Rivera" }, { "id": 1, "name": "Renaldo" } ] }
$['tags']
然後,JSONPath表達式會傳回下列值。
"["nisi","culpa","ad","amet","voluptate","reprehenderit","veniam"]"
$['friends'][1]
然後,JSONPath表達式會傳回下列值。
"{"id": 1,"name": "Renaldo"}"
jsonpaths
陣列中的每個JSONPath表達式對應至 Amazon Redshift 目標資料表中的一欄。jsonpaths
陣列元素的順序必須符合目標資料表或欄清單 (如果使用欄清單) 中的欄順序。
如需示範如何使用'auto'
引數或JSONPaths檔案以及使用JSON物件或陣列載入資料的範例,請參閱 從JSON範例複製。
如需有關如何複製多個JSON檔案的資訊,請參閱 使用資訊清單指定資料檔案。
中的逸出字元 JSON
COPY \n
會以新行字元載入,並以\t
標籤字元載入。若要載入反斜線,請加上反斜線 ( \\
) 來逸出。
例如,假設您在 儲存貯體 JSON 中名為 escape.json
的檔案中具有下列項目s3://amzn-s3-demo-bucket/json/
。
{ "backslash": "This is a backslash: \\", "newline": "This sentence\n is on two lines.", "tab": "This sentence \t contains a tab." }
執行下列命令來建立ESCAPES資料表並載入 JSON。
create table escapes (backslash varchar(25), newline varchar(35), tab varchar(35)); copy escapes from 's3://amzn-s3-demo-bucket/json/escape.json' iam_role 'arn:aws:iam::0123456789012:role/MyRedshiftRole' format as json 'auto';
查詢ESCAPES資料表以檢視結果。
select * from escapes; backslash | newline | tab ------------------------+-------------------+---------------------------------- This is a backslash: \ | This sentence | This sentence contains a tab. : is on two lines. (1 row)
遺失數值精確度
將數字從JSON格式的資料檔案載入定義為數字資料類型的資料欄時,可能會失去精確度。電腦系統中無法精確表示某些浮點值。因此,您從JSON檔案複製的資料可能無法如預期般四捨五入。為了避免遺失精確度,建議您使用下列其中一個替代方法:
-
以字串來表示數字,用雙引號括住值。
-
使用 ROUNDEC來四捨五入數字,而不是截斷數字。
-
不使用 JSON或 Avro 檔案,而是使用 CSV、字元分隔或固定寬度的文字檔案。