本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
從字符串中提取JSON數據
您可能有包含JSON編碼字串的來源資料,而您不一定要將這些字串還原序列化為 Athena 中的資料表。在這種情況下,您仍然可以使用 Presto 中可用的JSON功能對此數據運行SQL操作。
將此JSON字串視為範例資料集。
{"name": "Susan Smith",
"org": "engineering",
"projects":
[
{"name":"project1", "completed":false},
{"name":"project2", "completed":true}
]
}
範例:擷取屬性
若要從JSON字串萃取name
和projects
屬性,請使用json_extract
函數,如下列範例所示。該json_extract
函數採用包含JSON字符串的列,並使用帶有點.
符號的JSONPath
類似表達式對其進行搜索。
注意
JSONPath
會執行簡單的樹狀目錄周遊。它使用$
符號來表示JSON文檔的根,後面接著一個句點和嵌套在根下直接的元素,例如$.name
。
WITH dataset AS ( SELECT '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false}, {"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract(myblob, '$.name') AS name, json_extract(myblob, '$.projects') AS projects FROM dataset
傳回的值是經過JSON編碼的字串,而非原生 Athena 資料類型。
+-----------------------------------------------------------------------------------------------+
| name | projects |
+-----------------------------------------------------------------------------------------------+
| "Susan Smith" | [{"name":"project1","completed":false},{"name":"project2","completed":true}] |
+-----------------------------------------------------------------------------------------------+
若要從JSON字串中擷取純量值,請使用json_extract_scalar
函數。它類似於 json_extract
,但只會傳回純量值 (布林值、數字或字串)。
注意
請勿在陣列、地圖或結構上使用 json_extract_scalar
函數。
WITH dataset AS ( SELECT '{"name": "Susan Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract_scalar(myblob, '$.name') AS name, json_extract_scalar(myblob, '$.projects') AS projects FROM dataset
此查詢會傳回:
+---------------------------+
| name | projects |
+---------------------------+
| Susan Smith | |
+---------------------------+
若要取得範例陣列中 projects
屬性的第一個元素,請使用 json_array_get
函數,並指定索引位置。
WITH dataset AS ( SELECT '{"name": "Bob Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_array_get(json_extract(myblob, '$.projects'), 0) AS item FROM dataset
它返回在 JSON-coded 數組中指定索引位置的值。
+---------------------------------------+
| item |
+---------------------------------------+
| {"name":"project1","completed":false} |
+---------------------------------------+
若要傳回 Athena 字串類型,請在 JSONPath
表達式內使用 []
運算子,然後使用 json_extract_scalar
函數。如需有關 []
的詳細資訊,請參閱 訪問數組元素。
WITH dataset AS ( SELECT '{"name": "Bob Smith", "org": "engineering", "projects": [{"name":"project1", "completed":false},{"name":"project2", "completed":true}]}' AS myblob ) SELECT json_extract_scalar(myblob, '$.projects[0].name') AS project_name FROM dataset
它會傳回此結果:
+--------------+
| project_name |
+--------------+
| project1 |
+--------------+