Hologres, JSON verilerini ayıklamak ve oluşturmak için iki JSON işlevini destekler: GET_JSON_OBJECT belirtilen bir yoldan JSON dizesinden bir değer ayıklar ve ROW_TO_JSON bir satırı JSON dizesine dönüştürür.
| İşlev | Amaç | Giriş | Çıktı | Sürüm |
|---|---|---|---|---|
GET_JSON_OBJECT |
Bir JSON yolundaki değeri ayıkla | JSON dizesi (TEXT), yol ifadesi | TEXT | Herhangi biri (hive_compatible uzantısı gerektirir) |
ROW_TO_JSON |
Bir satırı JSON dizesine dönüştür | Kayıt (tablo, görünüm veya alt sorgu) | JSON dizesi | Hologres V1.3 ve üzeri |
GET_JSON_OBJECT
GET_JSON_OBJECT bir yol ifadesi kullanarak JSON dizesinden bir JSON nesnesi veya skaler değer ayıklar.
Önkoşullar
GET_JSON_OBJECT kullanmadan önce şemanızda hive_compatible uzantısını oluşturun. Daha fazla bilgi için bkz. Uzantılar.
CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA <schema_name>;
Söz dizimi
SELECT get_json_object(json_string, path);
Parametreler
| Parametre | Tür | Açıklama |
|---|---|---|
json_string |
TEXT | Geçerli bir JSON dizesi. |
path |
TEXT | Ayıklanacak değeri tanımlayan bir yol ifadesi. Bkz. Yol ifadesi söz dizimi. |
Dönüş değeri: Ayıklanan değer TEXT olarak döndürülür. Yol JSON içinde yoksa veya JSON dizesi geçersizse NULL döndürülür.
Yol ifadesi söz dizimi
Bir yol ifadesi, bir JSON değişkenini temsil eden $ ile başlar. JSON yapısında gezinmek için aşağıdaki operatörleri kullanın:
| Operatör | Açıklama | Örnek |
|---|---|---|
.key |
Anahtara göre bir nesne alanına erişin | $.store.name |
[n] |
Sıfır tabanlı indekse göre bir dizi öğesine erişin | $.items[0] |
Dizi indeksleme 0 tabanlıdır.$.items[0]ilk öğeyi döndürür ve$.items[1]ikinci öğeyi döndürür.
Örnekler
Örnek verileri ayarlayın:
-- Create the extension in pg_catalog so all users can access it.
CREATE EXTENSION IF NOT EXISTS hive_compatible SCHEMA pg_catalog;
-- Create and populate the sample table.
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"}');
Üst düzey bir alanı ayıklayın — $.owner değerini alın:
-- Returns: amy
SELECT get_json_object(col_json, '$.owner')
FROM hive_json_example;
İç içe geçmiş nesnelere gidin — $.store.bicycle.price konumundaki bisiklet fiyatını alın:
-- Returns: 19.95
SELECT get_json_object(col_json, '$.store.bicycle.price')
FROM hive_json_example;
Bir dizi öğesine indekse göre erişin — $.store.fruit[0] konumundaki ilk öğeyi alın:
-- Returns: {"weight":8,"type":"apple"}
SELECT get_json_object(col_json, '$.store.fruit[0]')
FROM hive_json_example;
Mevcut olmayan anahtar — yol mevcut olmadığında NULL döndürür:
-- Returns: NULL
SELECT get_json_object(col_json, '$.no_key')
FROM hive_json_example;
ROW_TO_JSON
ROW_TO_JSON bir satırı JSON dizesine dönüştürür. En fazla 50 sütunu kabul eder.
ROW_TO_JSON Hologres V1.3 ve sonraki sürümlerde kullanılabilir. Yükseltmek için örneğinizi yükseltin veya Hologres DingTalk grubu aracılığıyla destek ile iletişime geçin.
Söz dizimi
SELECT ROW_TO_JSON(record);
Parametreler
| Parametre | Açıklama |
|---|---|
record |
Satır türünde bir değer: tablo adı, görünüm adı veya alt sorgu sonucu. |
Dönüş değeri: Her anahtarın kayıtta bir sütuna karşılık geldiği bir JSON dizesi.
Anahtar adlandırması Hologres sürümüne bağlıdır:
V1.3.52 öncesi : Anahtarlar konumsaldır —f1,f2vb.
V1.3.52 ve sonrası : Anahtarlar sütun adlarına dayanır.
Örnekler
Örnek verileri ayarlayın:
CREATE TABLE interests_test (
name text,
intrests text
);
INSERT INTO interests_test VALUES
('Ava', 'singing, dancing'),
('Bob', 'playing football, running, painting'),
('Jack', 'arranging flowers, writing calligraphy, playing the piano, sleeping');
Her satırı bir JSON dizesine dönüştürün:
SELECT ROW_TO_JSON(t)
FROM (
SELECT name, intrests
FROM interests_test
) AS t;
Hologres V1.3.52 ve sonraki sürümlerde anahtarlar sütun adlarını kullanır:
row_to_json
------------------------------
"{"name": "Jack", "interests": "arranging flowers, writing calligraphy, playing the piano, sleeping"}"
"{"name": "Ava", "interests": "singing, dancing"}"
"{"name": "Bob", "interests": "playing football, running, painting"}"
V1.3.52'den önceki Hologres sürümlerinde anahtarlar konumsal adları kullanır:
row_to_json
------------------------------
{"f1":"Ava","f2":"singing, dancing"}
{"f1":"Bob","f2":"playing football, running, painting"}
{"f1":"Jack","f2":"arranging flowers, writing calligraphy, playing the piano, sleeping"}
Sorun giderme
ERROR: function get_json_object (text, unknown) does not exist
Neden 1 — Eksik şema izni
Şema düzeyi izin modelinde (SLPM), RAM kullanıcısının uzantının oluşturulduğu şemayı (örneğin public şeması) sorgulama izni yoktur.
Bunu düzeltmek için aşağıdaki seçeneklerden birini kullanın:
RAM kullanıcısına bu şemayı sorgulama izni verin.
-
Uzantıyı tüm kullanıcıların varsayılan olarak erişebileceği
pg_catalogiçinde yeniden oluşturun:DROP EXTENSION hive_compatible; CREATE EXTENSION hive_compatible SCHEMA pg_catalog;
Neden 2 — İlk bağımsız değişken TEXT değil
GET_JSON_OBJECT ilk bağımsız değişkenin TEXT türünde olmasını gerektirir. Sütunun farklı bir veri türü varsa TEXT'e dönüştürün:
SELECT get_json_object(col::text, '$.key') FROM your_table;
ERROR: get_json_object for fe, should not be evaluated
Neden 1 — İlk bağımsız değişken bir sabit
GET_JSON_OBJECT ilk bağımsız değişken olarak bir dize sabitini kabul etmez. Bunun yerine bir tablo sütun referansı iletin:
-- Correct: pass a column reference
SELECT get_json_object(col_json, '$.key') FROM your_table;
Neden 2 — İlk bağımsız değişken NULL içeriyor
İşlevi çağırmadan önce sütunun NULL olduğu satırları kaldırın:
SELECT get_json_object(col_json, '$.key')
FROM your_table
WHERE col_json IS NOT NULL;