從字符串中提取JSON數據 - Amazon Athena

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

從字符串中提取JSON數據

您可能有包含JSON編碼字串的來源資料,而您不一定要將這些字串還原序列化為 Athena 中的資料表。在這種情況下,您仍然可以使用 Presto 中可用的JSON功能對此數據運行SQL操作。

將此JSON字串視為範例資料集。

{"name": "Susan Smith", "org": "engineering", "projects": [ {"name":"project1", "completed":false}, {"name":"project2", "completed":true} ] }

範例:擷取屬性

若要從JSON字串萃取nameprojects屬性,請使用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 | +--------------+