JSON函數(shù)
本文為您介紹實(shí)時(shí)數(shù)倉(cāng)Hologres相關(guān)的JSON函數(shù)。
GET_JSON_OBJECT
語(yǔ)法
GET_JSON_OBJECT用于解析JSON對(duì)象。在使用GET_JSON_OBJECT函數(shù)前,需要先創(chuàng)建加載擴(kuò)展(Extension),詳情請(qǐng)參見(jiàn)Extension擴(kuò)展。
--創(chuàng)建Extension CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA <schema_name>; SELECT get_json_object ( json_string, path );
參數(shù)說(shuō)明
參數(shù)
描述
json_string
JSON對(duì)象變量,TEXT類型。格式為合法JSON格式字符串。
path
JSON內(nèi)層對(duì)象訪問(wèn)變量。使用
$
表示JSON變量標(biāo)識(shí),通過(guò).
或[]
讀取JSON內(nèi)層對(duì)象或數(shù)組。如果您輸入的JSON字符串無(wú)效,則系統(tǒng)返回NULL。
示例
準(zhǔn)備示例數(shù)據(jù)。
--創(chuàng)建Extension CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA pg_catalog; --準(zhǔn)備示例數(shù)據(jù) BEGIN; CREATE TABLE hive_json_example ( col_json text ); COMMIT; INSERT INTO hive_json_example VALUES ('{"store":{"fruit":[{"weight":8,"type":"apple"}, {"weight":9,"type":"pear"}],"bicycle":{"price":19.95,"color":"red"}},"email":"amy@only_for_json_udf_test.net","owner":"amy"}');
示例1:從
col_json
列中查詢JSON對(duì)象中$.owner
路徑下的數(shù)據(jù)。--返回結(jié)果為:amy SELECT get_json_object (col_json, '$.owner') FROM hive_json_example;
示例2:從
col_json
列中查詢JSON對(duì)象中$.store.bicycle.price
路徑下的數(shù)據(jù)。--返回結(jié)果為:19.95 SELECT get_json_object (col_json, '$.store.bicycle.price') FROM hive_json_example;
示例3:從
col_json
列中查詢JSON對(duì)象中$.store.fruit
路徑下fruit
數(shù)組的第一個(gè)元素(索引為0)。-- 返回結(jié)果為:{"weight":8, "type":"apple"} SELECT get_json_object (col_json, '$.store.fruit[0]') FROM hive_json_example;
示例4:查看非JSON對(duì)象變量的數(shù)據(jù)。
--返回值為:NULL SELECT get_json_object (col_json, '$.no_key') FROM hive_json_example;
ROW_TO_JSON
ROW_TO_JSON函數(shù)支持將多個(gè)字符串或列(最多50列)拼接成一個(gè)JSON并返回。
僅Hologres V1.3及以上版本支持ROW_TO_JSON函數(shù),若想要使用該函數(shù)您可以通過(guò)加入實(shí)時(shí)數(shù)倉(cāng)Hologres交流群申請(qǐng)升級(jí)實(shí)例或實(shí)例升級(jí),加群方式請(qǐng)參見(jiàn)如何獲取更多的在線支持?。
語(yǔ)法
SELECT ROW_TO_JSON(record)
參數(shù)說(shuō)明
record:是一個(gè)行類型的參數(shù),可以是表名、視圖名或者查詢結(jié)果。
示例
--準(zhǔn)備測(cè)試數(shù)據(jù) CREATE TABLE interests_test ( name text, intrests text ); INSERT INTO interests_test VALUES ('張三', '唱歌,跳舞'), ('李四', '踢球,跑步,畫畫'), ('王五', '插花,書法,彈琴,睡覺(jué)'); SELECT ROW_TO_JSON(t) FROM ( SELECT name, intrests FROM interests_test) AS t;
Hologres從V1.3.52版本開(kāi)始,JSON中的Key支持根據(jù)列名生成。
V1.3.52以下版本返回結(jié)果如下。
row_to_json ------------------------------ {"f1":"張三","f2":"唱歌,跳舞"} {"f1":"李四","f2":"踢球,跑步,畫畫"} {"f1":"王五","f2":"插花,書法,彈琴,睡覺(jué)"}
V1.3.52及以上版本返回結(jié)果如下。
row_to_json ------------------------------ "{"name" : "王五", "intrests" : "插花,書法,彈琴,睡覺(jué)"}" "{"name" : "張三", "intrests" : "唱歌,跳舞"}" "{"name" : "李四", "intrests" : "踢球,跑步,畫畫"}"
常見(jiàn)報(bào)錯(cuò)
報(bào)錯(cuò):
ERROR:function get_json_object (text, unknown) does not exist
。可能原因一
在SLPM模式下RAM用戶沒(méi)有創(chuàng)建extension所在Schema的查詢權(quán)限(例如extension指定創(chuàng)建在名稱為public的Schema下,RAM用戶沒(méi)有public的查詢權(quán)限)。
解決方法一
授予RAM用戶Schema的查詢權(quán)限。
使用如下命令重新創(chuàng)建extension在pg_catalog下,所有賬號(hào)都可查詢。
DROP EXTENSION hive_compatible; CREATE EXTENSION hive_compatible schema pg_catalog;
可能原因二
GET_JSON_OBJECT的第一個(gè)參數(shù)不是TEXT類型。
解決方法二
將第一個(gè)參數(shù)轉(zhuǎn)換為TEXT類型。
報(bào)錯(cuò):
ERROR: get_json_object for fe, should not be evaluated
。可能原因一
GET_JSON_OBJECT的第一個(gè)參數(shù)是常量。
解決方法一
第一個(gè)參數(shù)使用表的列。
可能原因二
GET_JSON_OBJECT的第一個(gè)參數(shù)含有為NULL的值。
解決方法二
將第一個(gè)參數(shù)為NULL的值刪除。