Tüm Ürünler
Search
Belge Merkezi

Hologres:JSON and JSONB

Son Güncelleme:Oct 06, 2026

Hologres, esnek ve şemasız verileri depolamak ve sorgulamak için yarı yapılandırılmış veri türleri olarak JSON ve JSONB'yi destekler. Bu konu, iki tür arasındaki farkları, desteklenen işleçleri ve işlevleri, GIN dizinlemeyi ve Realtime Compute for Apache Flink ile entegrasyonu kapsar.

JSON ve JSONB: Doğru Türü Seçme

Her iki tür de JSON biçimindeki verileri depolar ancak depolama biçimi ve performans özellikleri açısından farklılık gösterir.

JSON JSONB
Depolama biçimi Düz metin Ayrıştırılmış ikili
Yazma hızı Hızlı Daha yavaş (yazma sırasında ek dönüşüm gerekir)
Okuma hızı Daha yavaş (her sorguda yeniden ayrıştırılır) Daha hızlı (yeniden ayrıştırma gerekmez)
Giriş metnini tam olarak korur Evet — boşluklar, anahtar sırası ve yinelenen anahtarlar saklanır Hayır — boşluklar kaldırılır, anahtarlar tekilleştirilir (son değer geçerli olur), anahtar sırası korunmaz
GIN dizinlerini destekler Hayır Evet (Hologres V1.1 ve üzeri)
Sütun tabanlı depolamayı destekler Hayır Evet (Hologres V1.3 ve üzeri)

Öneri: Çoğu iş yükü için JSONB kullanın. JSONB, sorgulaması daha hızlıdır, GIN dizinlerini ve sütun tabanlı depolamayı destekler. Anahtar sırası, boşluklar ve yinelenen anahtarlar dahil olmak üzere giriş metninin tam olarak korunması gerektiğinde yalnızca JSON kullanın.

Yinelenen anahtar davranışı: Bir giriş değerinde aynı anahtar birden çok kez göründüğünde, JSON tüm anahtar-değer çiftlerini korur (işleme işlevleri son değeri yetkili kabul eder), JSONB ise yalnızca son değeri tutar.

Sınırlamalar

Kısıtlama Ayrıntı
JSON veri türü Hologres V0.9 veya sonraki sürümler gerektirir.
JSONB GIN dizinleri Hologres V1.1 veya sonraki sürümler gerektirir.
JSONB sütun tabanlı depolama Hologres V1.3 veya sonraki sürümler gerektirir. Yalnızca sütun tabanlı tablolar için desteklenir; satır tabanlı tablolar desteklenmez. Tabloda 1.000 veya daha fazla kayıt olduğunda sütun tabanlı depolama etkinleşir.
GIN dizinleri + sütun tabanlı depolama Hologres V3.0.42 ve V3.1.10'dan itibaren birbirini dışlar. İkisi de etkinleştirildiğinde GIN dizinleri etkili olmaz. Seyrek olmayan alanlar için sütun tabanlı depolamayı kullanın.
Desteklenmeyen işlevler json_each, jsonb_each, json_each_text, jsonb_each_text, json_extract_path, jsonb_extract_path, jsonb_to_record

json_extract_path ve jsonb_extract_path için geçici çözüm: Bunun yerine #> yol işlecini kullanın.

-- json_extract_path equivalent
SELECT '{"key":{"key1":"key1","key2":"key2"}}'::json #> '{"key","key1"}';

-- jsonb_extract_path equivalent
SELECT '{"key":{"key1":"key1","key2":"key2"}}'::jsonb #> '{"key","key1"}';

Örneğinizi yükseltme hakkında daha fazla bilgi için bkz. Örnek yükseltmeleri.

İşleçler

Sık kullanılan işleçler

Aşağıdaki altı işleç hem JSON hem de JSONB ile çalışır.

**İşleç** **Sağ operand türü** **Açıklama** **Örnek** **Sonuç**
-> int Bir JSON dizi öğesini dizine göre alır (0 tabanlı; negatif değerler sondan sayar). select '[{"a":"foo"},{"b":"bar"},{"c":"baz"}]'::json->2 {"c":"baz"}
-> text Bir JSON nesne alanını anahtara göre alır. select '{"a": {"b":"foo"}}'::json->'a' {"b":"foo"}
->> int Bir JSON dizi öğesini metin olarak alır. select '[1,2,3]'::json->>2 3
->> text Bir JSON nesne alanını metin olarak alır. select '{"a":1,"b":2}'::json->>'b' 2
#> text[] Belirtilen yoldaki bir JSON nesnesini alır. select '{"a": {"b":{"c": "foo"}}}'::json#>'{a,b}' {"c":"foo"}
#>> text[] Belirtilen yoldaki bir JSON nesnesini metin olarak alır. select '{"a":[1,2,3],"b":[4,5,6]}'::json#>>'{a,2}' 3

Yalnızca JSONB işleçleri

Aşağıdaki işleçler yalnızca JSONB verilerine uygulanır ve içerik kontrollerini, anahtar varlık testlerini, birleştirmeyi ve silmeyi destekler.

**İşleç** **Sağ operand türü** **Açıklama** **Örnek** **Sonuç**
@> jsonb Sol değerin sağ JSON yolunu veya değerini içerip içermediğini kontrol eder. select '{"a":1, "b":2}'::jsonb @> '{"b":2}'::jsonb true
<@ jsonb Sol JSON yolunun veya değerinin sağ değer tarafından içerilip içerilmediğini kontrol eder. select '{"b":2}'::jsonb <@ '{"a":1, "b":2}'::jsonb true
? text Bir anahtarın veya öğe dizesinin JSONB değerinde bulunup bulunmadığını kontrol eder. select '{"a":1, "b":2}'::jsonb ? 'b' true
?| text[] Dizideki herhangi bir anahtarın veya öğe dizesinin JSONB değerinde bulunup bulunmadığını kontrol eder. select '{"a":1, "b":2, "c":3}'::jsonb ?| array['b', 'c'] true
?& text[] Dizideki tüm dizelerin JSONB değerinde bulunup bulunmadığını kontrol eder. select '["a", "b"]'::jsonb ?& array['a', 'b'] true
|| jsonb İki JSONB değerini birleştirir. Aynı anahtara sahip nesneler için sağ operandın değeri kullanılır. Bu işleç özyinelemeli değildir. select '["a", "b"]'::jsonb || '["c", "d"]'::jsonb ["a", "b", "c", "d"]
- text Eşleşen anahtarı veya değeri sol operanddan siler. select '{"a": "b"}'::jsonb - 'a' {}
- text[] Birden çok eşleşen anahtarı veya değeri sol operanddan siler. select '{"a": "b", "c": "d"}'::jsonb - '{a,c}'::text[] {}
- integer Belirtilen konumdaki dizi öğesini siler (negatif değerler sondan sayar). Değer bir dizi değilse hata döndürür. select '["a", "b"]'::jsonb - 1 ["a"]
#- text[] Belirtilen yoldaki öğeyi siler. Diziler için negatif tamsayılar sondan sayar. select '["a", {"b":1}]'::jsonb #- '{1,b}' ["a", {}]

İşlevler

İşleme işlevleri

İşlevDönüş türüAçıklamaÖrnekSonuç
json_array_length(json) / jsonb_array_length(jsonb)intEn dıştaki JSON dizisindeki öğe sayısını döndürür.select json_array_length('[1,2,3,{"f1":1,"f2":[5,6]},4]')5
json_object_keys(json) / jsonb_object_keys(jsonb)setof textEn dıştaki JSON nesnesindeki anahtar kümesini döndürür.select json_object_keys('{"f1":"abc","f2":{"f3":"a", "f4":"b"}}')f1 f2
json_populate_record(base anyelement, from_json json) / jsonb_populate_record(base anyelement, from_json jsonb)anyelementfrom_json içindeki nesneyi, base tarafından tanımlanan kayıt türüyle eşleşen bir satıra genişletir. Bir cast varsa uygulanır; yoksa değer JSON metni olarak temsil edilir.select * from json_populate_record(null::myrowtype, '{"a": 1, "b": ["2", "a b"], "c": {"d": 4, "e": "a b c"}}')1 | ["2", "a b"] | {"d": 4, "e": "a b c"}
json_populate_recordset(base anyelement, from_json json) / jsonb_populate_recordset(base anyelement, from_json jsonb)setof anyelementfrom_json içindeki en dıştaki nesne dizisini, base tarafından tanımlanan kayıt türüyle eşleşen bir satır kümesine genişletir.select * from json_populate_recordset(null::myrowtype, '[{"a":1,"b":2},{"a":3,"b":4}]')1|2 3|4
json_array_elements(json) / jsonb_array_elements(jsonb)setof json / setof jsonbBir JSON dizisini bir JSON değeri kümesine genişletir.select * from json_array_elements('[1,true, [2,false]]')1 true [2,false]
json_array_elements_text(json) / jsonb_array_elements_text(jsonb)setof textBir JSON dizisini bir metin değeri kümesine genişletir.select * from json_array_elements_text('["foo", "bar"]')foo bar
json_typeof(json) / jsonb_typeof(jsonb)textEn dıştaki JSON değerinin veri türünü metin olarak döndürür. Olası değerler: OBJECT, ARRAY, STRING, NUMBER, BOOLEAN, NULL.select json_typeof('-123.4')number
json_strip_nulls(from_json json) / jsonb_strip_nulls(from_json jsonb)json / jsonbNull değerlere sahip tüm nesne alanlarını kaldırır. Diğer null değerler korunur.select json_strip_nulls('[{"f1":1,"f2":null},2,null,3]')[{"f1":1},2,null,3]
jsonb_set(target jsonb, path text[], new_value jsonb [, create_missing boolean])jsonbtarget içindeki path konumundaki değeri new_value ile değiştirir. create_missing true (varsayılan) ise ve yol mevcut değilse new_value eklenir. path içindeki negatif tamsayılar dizilerin sonundan sayar.select jsonb_set('[{"f1":1,"f2":null},2,null,3]', '{0,f1}','[2,3,4]', false)[{"f1":[2,3,4],"f2":null},2,null,3]
jsonb_insert(target jsonb, path text[], new_value jsonb [, insert_after boolean])jsonbtarget içindeki path konumuna new_value ekler. Dizi yolları için: varsayılan olarak hedef öğeden önce ekler (insert_after = false); sonra eklemek için true olarak ayarlayın. Nesne yolları için: yalnızca anahtar mevcut değilse ekler. path içindeki negatif tamsayılar sondan sayar.select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'){"a": [0, "new_value", 1, 2]}
jsonb_pretty(from_json jsonb)textfrom_json değerini girintili, okunabilir JSON metni olarak döndürür.select jsonb_pretty('[{"f1":1,"f2":null},2,null,3]')[{ "f1": 1, "f2": null }, 2, null, 3]
jsonb_aggjsonbDeğerleri (null değerler dahil) bir JSON dizisine toplar.Aşağıdaki örneğe bakın.—
jsonb_object_aggjsonbAnahtar-değer çiftlerini bir JSON nesnesine toplar. Anahtarlar null olamaz; değerler null olabilir.Aşağıdaki örneğe bakın.—
is_valid_json(text)booleanGiriş dizesi geçerli JSON ise true; aksi takdirde false döndürür. ARRAY değerleri de geçerli JSON'dur ve JSON veya JSONB sütunlarına yazılabilir. Hologres V1.3.12 veya sonraki sürümler gerektirir.Aşağıdaki örneğe bakın.—

jsonb_agg ve jsonb_object_agg örneği:

DROP TABLE IF EXISTS t;

CREATE TABLE t (
    k int PRIMARY KEY,
    class int NOT NULL,
    v text NOT NULL
);

INSERT INTO t (k, class, v)
SELECT
    (1 + s.v),
    CASE (s.v) < 3
    WHEN TRUE THEN 1
    ELSE 2
    END,
    chr(97 + s.v)
FROM generate_series(0, 5) AS s (v);

SELECT
    class,
    jsonb_agg(v ORDER BY v DESC) FILTER (WHERE v <> 'b') AS "jsonb_agg",
    jsonb_object_agg(v, k ORDER BY v DESC) FILTER (WHERE v <> 'e') AS "jsonb_object_agg(v, k)"
FROM t
GROUP BY class;

Sonuç:

 class |    jsonb_agg    |  jsonb_object_agg(v, k)
-------+-----------------+--------------------------
     1 | ["c", "a"]      | {"a": 1, "b": 2, "c": 3}
     2 | ["f", "e", "d"] | {"d": 4, "f": 6}

is_valid_json örneği:

DROP TABLE IF EXISTS test_json;

CREATE TABLE test_json (
    id int,
    json_strings text
);

INSERT INTO test_json
    VALUES (1, '{"a":2}'), (2, '{"a":{"b":{"c":1}}}'), (3, '{"a": [1,2,"b"]}');

INSERT INTO test_json
    VALUES (4, '{{}}'), (5, '{1:"a"}'), (6, '[1,2,3]');

SELECT
    id,
    json_strings,
    is_valid_json(json_strings)
FROM test_json
ORDER BY id;

Sonuç:

 id | json_strings        | is_valid_json
----+---------------------+--------------
  1 | {"a":2}             | true
  2 | {"a":{"b":{"c":1}}} | true
  3 | {"a": [1,2,"b"]}    | true
  4 | {{}}                | false
  5 | {1:"a"}             | false
  6 | [1,2,3]             | true

Ayrıştırma işlevleri

İşlevAçıklamaÖrnekSonuç
try_cast_to_jsonb(text)Bir metin değerini JSONB'ye dönüştürür. Giriş geçerli JSONB değilse null döndürür. Hologres V2.0.24 veya sonraki sürümler gerektirir.select try_cast_to_jsonb('{"key": 1}') select try_cast_to_jsonb('{"key": 1'{"key": 1} NULL
to_json(anyelement) / to_jsonb(anyelement)Değeri bir JSON nesnesi olarak döndürür. Diziler ve bileşikler özyinelemeli olarak dönüştürülür. Skaler değerler varsa bir cast işlevi kullanır; yoksa JSON metni olarak temsil edilir.select to_json('Fred said "Hi."'::text)"Fred said \"Hi.\""
array_to_json(anyarray [, pretty_bool])Bir diziyi JSON dizisi olarak döndürür. Çok boyutlu diziler iç içe geçmiş JSON dizileri oluşturur. pretty_bool true olduğunda üst düzey öğeler arasına satır sonları eklenir.select array_to_json('{{1,5},{99,100}}'::int[])[[1,5],[99,100]]
json_build_array(VARIADIC "any") / jsonb_build_array(VARIADIC "any")Değişken bir argüman listesinden bir JSON dizisi oluşturur. Argümanlar farklı türlerde olabilir.select json_build_array(1,2,'3',4,5)[1, 2, "3", 4, 5]
json_build_object(VARIADIC "any") / jsonb_build_object(VARIADIC "any")Değişken uzunlukta alternatif anahtar-değer argümanlarından bir JSON nesnesi oluşturur.select json_build_object('foo',1,'bar',2){"foo": 1, "bar": 2}
json_object(text[]) / jsonb_object(text[])Bir metin dizisinden bir JSON nesnesi oluşturur. Çift sayıda üyeye (alternatif anahtar-değer çiftleri) sahip tek boyutlu bir dizi veya her iç dizinin bir anahtar-değer çifti olduğu iki boyutlu bir dizi kabul eder.select json_object('{a, 1, b, "def", c, 3.5}'){"a": "1", "b": "def", "c": "3.5"}
json_object(keys text[], values text[]) / jsonb_object(keys text[], values text[])Ayrı anahtar ve değer dizilerinden bir JSON nesnesi oluşturur.select json_object('{a, b}', '{1,2}'){"a": "1", "b": "2"}

JSONB Alan Dizinleme

Hologres V1.1 ve sonraki sürümler, sorguları hızlandırmak için JSONB alanlarında GIN dizinlerini ve B-tree dizinlerini destekler. JSON alanları yerine JSONB alanlarını dizinleyin — GIN dizinleri JSON için kullanılamaz.

JSONB GIN dizinleri seyrek JSONB alanları için uygundur. Seyrek olmayan alanlar için bunun yerine JSONB sütun tabanlı depolama optimizasyonunu kullanın. Hologres V3.0.42 ve V3.1.10'dan itibaren GIN dizinleri ve sütun tabanlı depolama birlikte kullanılamaz — ikisi de etkinleştirildiğinde GIN dizinleri etkili olmaz.

İki GIN dizini işleç sınıfı mevcuttur:

  • jsonb_ops (varsayılan): Her anahtar ve değer için bir dizin girişi oluşturur. ?, ?|, ?& ve @> işleçlerini destekler.

  • jsonb_path_ops: Yalnızca her değer için bir dizin girişi oluşturur. Yalnızca @> işlecini destekler.

-- Create a GIN index using jsonb_ops (default)
CREATE INDEX idx_name ON table_name USING gin (idx_col);

-- Create a GIN index using jsonb_path_ops
CREATE INDEX idx_name ON table_name USING gin (idx_col jsonb_path_ops);

Yerel PostgreSQL İşleçleri

Yerel PostgreSQL GIN dizinleri, alma işleminden sonra bir veri yeniden kontrolü gerektirir, bu da sorgu performansı iyileştirmelerini sınırlayabilir. Aşağıdaki örnekler her iki işleç sınıfını da göstermektedir.

Örnek: Anahtar varlık sorgusu ile jsonb_ops dizini

-- 1. Create a table.
BEGIN;
DROP TABLE IF EXISTS json_table;
CREATE TABLE IF NOT EXISTS json_table
(
    id INT,
    j  jsonb
);
COMMIT;

-- 2. Create a GIN index using jsonb_ops.
CREATE INDEX index_json ON json_table USING GIN(j);

-- 3. Insert data.
INSERT INTO json_table VALUES
    (1, '{"key1": 1, "key2": [1, 2], "key3": {"a": "b"}}'),
    (1, '{"key1": 1}'),
    (2, '{"key2": [1, 2], "key3": {"a": "b"}}');

-- 4. Query rows where key1 exists.
SELECT * FROM json_table WHERE j ? 'key1';

Sonuç:

 id |                        j
----+-------------------------------------------------
  1 | {"key1": 1, "key2": [1, 2], "key3": {"a": "b"}}
  1 | {"key1": 1}

Dizinin kullanıldığını onaylamak için EXPLAIN çalıştırın:

EXPLAIN SELECT * FROM json_table WHERE j ? 'key1';
QUERY PLAN
Gather  (cost=0.00..0.26 rows=1000 width=12)
  ->  Local Gather  (cost=0.00..0.23 rows=1000 width=12)
        ->  Decode  (cost=0.00..0.23 rows=1000 width=12)
              ->  Bitmap Heap Scan on json_table  (cost=0.00..0.13 rows=1000 width=12)
                    Recheck Cond: (j ? 'key1'::text)
                    ->  Bitmap Index Scan on index_json  (cost=0.00..0.00 rows=0 width=0)
                          Index Cond: (j ? 'key1'::text)
Optimizer: HQO version 1.3.0

Bitmap Index Scan adımı, dizinin kullanıldığını onaylar.

Örnek: İçerik sorgusu ile jsonb_path_ops dizini

-- 1. Create a table.
BEGIN;
DROP TABLE IF EXISTS json_table;
CREATE TABLE IF NOT EXISTS json_table
(
    id INT,
    j  jsonb
);
COMMIT;

-- 2. Create a GIN index using jsonb_path_ops.
CREATE INDEX index_json ON json_table USING GIN(j jsonb_path_ops);

-- 3. Insert 1,000,000 rows.
INSERT INTO json_table (
    SELECT
        i,
        ('{
            "key1": "'||i||'"
            ,"key2": "'||i%100||'"
            ,"key3": "'||i%1000||'"
            ,"key4": "'||i%10000||'"
            ,"key5": "'||i%100000||'"
        }')::jsonb
    FROM generate_series(1, 1000000) i
);

-- 4. Query rows containing '{"key1": "10"}'.
SELECT * FROM json_table WHERE j @> '{"key1": "10"}'::JSONB;

Sonuç:

 id |                                   j
----+------------------------------------------------------------------------
 10 | {"key1": "10", "key2": "10", "key3": "10", "key4": "10", "key5": "10"}
(1 row)

Dizinin kullanıldığını onaylamak için EXPLAIN çalıştırın:

EXPLAIN SELECT * FROM json_table WHERE j @> '{"key1": "10"}'::JSONB;
                                            QUERY PLAN
-------------------------------------------------------------------------------------------
 Gather  (cost=0.00..0.26 rows=1000 width=12)
   ->  Local Gather  (cost=0.00..0.23 rows=1000 width=12)
         ->  Decode  (cost=0.00..0.23 rows=1000 width=12)
               ->  Bitmap Heap Scan on json_table  (cost=0.00..0.13 rows=1000 width=12)
                     Recheck Cond: (j @> '{"key1": "10"}'::jsonb)
                     ->  Bitmap Index Scan on index_json  (cost=0.00..0.00 rows=0 width=0)
                           Index Cond: (j @> '{"key1": "10"}'::jsonb)
 Optimizer: HQO version 1.3.0
(8 rows)

Hologres İşleçleri

Hologres, yerel PostgreSQL GIN dizinlerinin gerektirdiği veri yeniden kontrol adımını ortadan kaldıran ve sorgu performansını artıran iki ek işleç sınıfı sağlar: jsonb_holo_ops ve jsonb_holo_path_ops.

jsonb_holo_ops ve jsonb_holo_path_ops 1 ila 127 bayt arasında dizin uzunluklarını destekler. 127 bayttan uzun dizin değerleri kırpılır ve kırpılan alanlar veri yeniden kontrolü gerektirir. Yeniden kontrol olup olmadığını kontrol etmek için EXPLAIN ANALYZE çalıştırın.
  • jsonb_holo_ops: jsonb_ops ile eşdeğerdir. ?, ?|, ?& ve @> işleçlerini destekler.

  • jsonb_holo_path_ops: jsonb_path_ops ile eşdeğerdir. Yalnızca @> işlecini destekler.

Örnek: jsonb_holo_ops dizini

-- 1. Create a table.
BEGIN;
DROP TABLE IF EXISTS json_table;
CREATE TABLE IF NOT EXISTS json_table
(
    id INT,
    j  jsonb
);
COMMIT;

-- 2. Create a GIN index using jsonb_holo_ops.
CREATE INDEX index_json ON json_table USING GIN(j jsonb_holo_ops);

-- 3. Insert data.
INSERT INTO json_table VALUES
    (1, '{"key1": 1, "key2": [1, 2], "key3": {"a": "b"}}'),
    (1, '{"key1": 1}'),
    (2, '{"key2": [1, 2], "key3": {"a": "b"}}');

-- 4. Query rows where key1 exists.
SELECT * FROM json_table WHERE j ? 'key1';

Sonuç:

 id |                        j
----+-------------------------------------------------
  1 | {"key1": 1}
  1 | {"key1": 1, "key2": [1, 2], "key3": {"a": "b"}}
(2 rows)

Örnek: jsonb_holo_path_ops dizini

-- 1. Create a table.
BEGIN;
DROP TABLE IF EXISTS json_table;
CREATE TABLE IF NOT EXISTS json_table
(
    id INT,
    j  jsonb
);

-- 2. Create a GIN index using jsonb_holo_path_ops.
CREATE INDEX index_json ON json_table USING GIN(j jsonb_holo_path_ops);

-- 3. Insert 1,000,000 rows.
INSERT INTO json_table (
    SELECT
        i,
        ('{
            "key1": "'||i||'"
            ,"key2": "'||i%100||'"
            ,"key3": "'||i%1000||'"
            ,"key4": "'||i%10000||'"
            ,"key5": "'||i%100000||'"
        }')::jsonb
    FROM generate_series(1, 1000000) i
);

-- 4. Query rows containing '{"key1": "10"}'.
SELECT * FROM json_table WHERE j @> '{"key1": "10"}'::JSONB;

Sonuç:

 id |                                   j
----+------------------------------------------------------------------------
 10 | {"key1": "10", "key2": "10", "key3": "10", "key4": "10", "key5": "10"}
(1 row)

Realtime Compute for Apache Flink'ten JSONB Verilerini İçe Aktarma

Realtime Compute for Apache Flink'ten Hologres'e JSON verilerini aktarırken, alan türlerinin her sistemin desteklediği türlerle eşleşmesi gerekir:

  • Flink kaynak ve sonuç tabloları: JSON alanlarını VARCHAR olarak tanımlayın.

  • Hologres iç tabloları: JSON alanlarını JSONB olarak tanımlayın.

Tam veri türü eşlemesi için bkz. Realtime Compute for Apache Flink ve Hologres arasındaki veri türü eşlemeleri.

Adım 1: JSONB sütunu içeren Hologres iç tablosunu oluşturun.

BEGIN;
DROP TABLE IF EXISTS holo_internal_table;
CREATE TABLE IF NOT EXISTS holo_internal_table
(
    id      BIGINT NOT NULL,
    message JSONB  NOT NULL
);
CALL set_table_property('holo_internal_table', 'distribution_key', 'id');
COMMIT;

Adım 2: JSON alanı için VARCHAR kullanarak Flink kaynak ve sonuç tablolarını oluşturun, ardından verileri Hologres'e yazın.

CREATE TEMPORARY TABLE randomSource (
    id      BIGINT,
    message VARCHAR
)
WITH ('connector' = 'datagen');

CREATE TEMPORARY TABLE sink_holo (
    id      BIGINT,
    message VARCHAR
)
WITH (
    'connector' = 'hologres',
    'dbname'    = '<yourDBname>',         -- Hologres database name
    'tablename' = '<holo_internal_table>', -- Target Hologres table
    'username'  = '<yourUsername>',       -- Alibaba Cloud AccessKey ID
    'password'  = '<yourPassword>',       -- Alibaba Cloud AccessKey secret
    'endpoint'  = '<yourEndpoint>'        -- VPC endpoint of your Hologres instance
);

INSERT INTO sink_holo
SELECT
    1,
    '{"k":"v"}'
FROM randomSource;

JSONB Verileri İçin Sütun Tabanlı Depolama

GIN dizinleri, hesaplama katmanında sorgu performansını optimize eder ancak yürütme sırasında yine de tam JSON içeriğinin taranmasını gerektirir. Hologres V1.3 ve sonraki sürümler, depolama katmanında optimizasyon sağlayan JSONB verileri için sütun tabanlı depolama sunar. JSONB verileri, yapılandırılmış veriler gibi sütunlarda depolanarak sıkıştırma verimliliği artırılır ve sorgular hızlandırılır.

Kurulum ve yapılandırma ayrıntıları için bkz. JSONB sorgularını hızlandırma.