COPY 從JSON格式 - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

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、字元分隔或固定寬度的文字檔案。