Tüm Ürünler
Search
Belge Merkezi

MaxCompute:JSON veri türü

Son Güncelleme:Oct 04, 2026

MaxCompute içinde yarı yapılandırılmış verileri depolamak için JSON türünü kullanın. Yazma sırasında MaxCompute otomatik olarak bir genel şema çıkarır ve bu alanları sütun bazlı biçimde saklar. Okuma sırasında sütun budama (column pruning), sorgunuzun yalnızca ilgilendiği alanları tarar; bu sayede STRING türüne kıyasla daha hızlı sorgu performansı ve daha düşük depolama maliyeti elde edersiniz.

JSON türünün ne zaman kullanılacağı


Durum


Öneri


Veriler yarı yapılandırılmış JSON formatındadır; satırlar arasında şema farklılık gösterir


JSON türünü kullanın


Şema tamamen sabittir; tüm alanlar her zaman mevcuttur


Türü belirtilmiş sütunları kullanın — daha iyi tür güvenliği ve daha geniş SQL uyumluluğu sağlar


JSON sütunu üzerinde ORDER BY, GROUP BY veya JOIN işlemine ihtiyaç duyuyorsunuz


Türü belirtilmiş sütunları kullanın — bu işlemler JSON türünde desteklenmez

Çalışma mekanizması

JSON verilerini eklediğinizde MaxCompute veriden otomatik olarak bir genel şema çıkarır ve optimizasyonlar uygular. Genel şemadaki alanlar sütun bazlı biçimde depolanır. Genel şemada bulunmayan alanlar ise BINARY olarak saklanır.

Örneğin, a, b ve c alanlarına sahip üç satırınız olduğunu varsayalım:

INSERT INTO json_table
SELECT json_parse(string_val)
FROM   string_table;

MaxCompute genel şemayı <"a":binary, "b":bigint, "c":bigint> şeklinde çıkarır. Yalnızca b ve c alanlarını okuyan sonraki bir sorgu, yalnızca bu sütunları tarar:

SELECT json_val["b"], json_val["c"]
FROM   json_table;
-- Column pruning keeps only b and c.
+------+------+
| _c0  | _c1  |
+------+------+
| 2    | NULL |
| 2    | NULL |
| NULL | 3    |
+------+------+

JSON değerleri MaxCompute iç türleri kullanılarak depolanır. Bu eşleme nedeniyle BIGINT veya DOUBLE aralığının dışındaki değerler taşmaya uğrayabilir veya hassasiyet kaybına neden olabilir.

Ön koşullar

Başlamadan önce aşağıdakilere sahip olduğunuzdan emin olun:

  • JSON türünün etkinleştirildiği bir MaxCompute projesi (bkz. JSON türünü etkinleştirin)

  • Java SDK V0.44.0 veya üzeri, ya da PyODPS V0.11.4.1 veya üzeri

  • odpscmd kullanıyorsanız: V0.46.5 veya üzeri sürüm ve conf\odps_config.ini dosyasında use_instance_tunnel=false ayarı

JSON türünü etkinleştirin

odps.sql.type.json.enable bayrağı JSON türünün kullanılabilirliğini kontrol eder:


Proje türü


Varsayılan değer


Yeni projeler


true


Mevcut projeler


false

Mevcut bir projede JSON türünü etkinleştirmek için:

SET odps.sql.type.json.enable=true;

Geçerli değeri kontrol etmek için:

setproject;

Sınırlamalar

Kısıtlama referansı


Kategori


Kısıtlama


Sonuç


Tablo işlemleri


Mevcut bir tabloya JSON sütunu eklenemez


Yeni bir tablo oluşturun; verileri INSERT INTO ... SELECT ile geçirin


Tablo türleri


Küme tabloları ve Delta Table türü desteklenmez


Standart tabloları kullanın


SQL işlemleri


JSON sütunları üzerinde ORDER BY, GROUP BY ve JOIN anahtarları desteklenmez


Önce değeri türü belirtilmiş bir sütuna çıkarın


SQL işlemleri


JSON türü üzerinde karşılaştırma işlemleri desteklenmez


Karşılaştırmadan önce STRING türüne veya türü belirtilmiş bir sütuna dönüştürün


İç içe geçme


Maksimum 20 derinlik seviyesi


Derin iç içe geçmiş yapıları alım öncesinde düzleştirin


Motor uyumluluğu


Hologres JSON sütunlarını okuyamaz


Çapraz motor okumaları gerekiyorsa bir STRING kopyası saklayın


Kullanıcı tanımlı işlevler (UDF'ler)


Java UDF'leri ve Python UDF'leri JSON türünü desteklemez


Bunun yerine yerleşik JSON işlevlerini kullanın


Araçlar


Dataphin ve diğer harici ekosistemler desteklenmez


Kullanım öncesinde uyumluluğu doğrulayın

Tür depolama ve hassasiyet

JSON değerleri MaxCompute iç türlerine eşlenir. Bu aralıkların dışındaki değerler taşmaya veya hassasiyet kaybına neden olur:


JSON türü


Dahili depolama


Not


SAYI (tam sayı kısmı)


BIGINT


BIGINT aralığı dışındaysa taşma oluşur


SAYI (ondalık kısım)


DOUBLE


Hassasiyet kaybı mümkündür


DİZGE


BINARY (genel olmayan) veya türü belirtilmiş sütun


\u0000 desteklenmez


BOOLEAN


BOOLEAN


NULL


—


json 'null' ifadesi SQL NULL ifadesinden farklıdır


DİZİ


DİZİ


NESNE


NESNE

Araç ve SDK gereksinimleri


Araç veya SDK


Gereksinim


odpscmd (MaxCompute istemcisi)


V0.46.5 veya üzeri; conf\odps_config.ini dosyasında use_instance_tunnel=false ayarını yapın


MaxCompute Studio


Desteklenir


DataWorks


Desteklenir


Java SDK


V0.44.0 veya üzeri


PyODPS


V0.11.4.1 veya üzeri

JSON türü ile çalışma

Aşağıdaki tüm örnekler, oluşturma, ekleme ve sorgulama kalıplarını uçtan uca göstermek için ortak bir sipariş kaydını kullanır:

{"id": 1001, "customer": "Molly", "amount": 299.50}

Bir JSON tablosu oluşturun

Şema tanımı gerekmez — sütunu JSON olarak bildirin:

CREATE TABLE orders (record JSON);

JSON verisi üretin

Bir JSON değişmez değerinden:

INSERT INTO orders VALUES (JSON '{"id": 1001, "customer": "Molly", "amount": 299.50}');

JSON_OBJECT ve JSON_ARRAY kullanarak:

-- JSON_OBJECT builds a JSON object from key-value pairs.
INSERT INTO orders SELECT JSON_OBJECT("id", 1002, "customer", "Frank", "amount", 150.00);

-- JSON_ARRAY builds a JSON array.
SELECT JSON_ARRAY("tag1", "tag2", "promo");
-- Returns: ["tag1","tag2","promo"]

Bir STRING sütununu dönüştürerek:

Mevcut dize verilerini dönüştürmek için json_parse kullanın. Hatalı biçimlendirilmiş satırları atlamak için bunu json_valid ile sarın:

INSERT INTO orders
SELECT json_parse(raw_json)
FROM   staging_table
WHERE  json_valid(raw_json);
CAST("abc" AS JSON) ve json_parse("abc") ifadeleri sınır durumlarında farklı davranır. Ayrıntılar için JSON işlevleri konusuna bakın.

JSON verilerine erişin

Aşağıdaki tüm örnekler yukarıda eklenen satırı sorgular: {"id": 1001, "customer": "Molly", "amount": 299.50}.

Dizin erişimi

Dizin erişimi katı modu kullanır — yol veri yapısıyla eşleşmediğinde NULL döndürülür.

-- Returns 1001
SELECT record['id']
FROM   orders
WHERE  record['id'] IS NOT NULL;

-- Returns "Molly"
SELECT record['customer']
FROM   orders;

-- Returns NULL (field does not exist)
SELECT record['email']
FROM   orders;

Dizin erişimi, katı moddaki JSON_EXTRACT ifadesine eşdeğerdir:

-- These two expressions return the same result:
SELECT record['id']                          FROM orders;
SELECT JSON_EXTRACT(record, 'strict $.id')   FROM orders;
-- Both return: 1001

JSON işlevlerini kullanarak erişim

İki işlev mevcuttur:


İşlev


Döndürür


JSON Yolu ayrıştırıcısı


JSON_EXTRACT


JSON türü


Yeni standartlaştırılmış ayrıştırıcı (PostgreSQL uyumlu alt küme)


GET_JSON_OBJECT


STRING türü


Eski ayrıştırıcı

Yeni SQL'de JSON_EXTRACT kullanın — ayrıştırıcısı dizin erişicisiyle tutarlıdır ve katı modda sütun budamayı destekler.

-- JSON_EXTRACT returns a JSON value (with quotes).
SELECT JSON_EXTRACT(record, '$.customer')
FROM   orders;
-- Returns: "Molly"

-- GET_JSON_OBJECT returns a STRING value (no quotes).
SELECT GET_JSON_OBJECT(record, '$.customer')
FROM   orders;
-- Returns: Molly

JSON Yolu referansı

JSON Yolu, JSON verilerindeki bir düğümü tanımlar. JSON türü tarafından kullanılan ayrıştırıcı, PostgreSQL JSON Yolu belirtiminin bir alt kümesidir.

JSON Yolu örnekleri için örnek veriler:

{
  "name": "Molly",
  "phones": [
    { "phonetype": "work",  "phone#": "650-506-7000" },
    { "phonetype": "cell",  "phone#": "650-555-5555" }
  ]
}

Erişimci sözdizimi:


Erişimci


Örnek


Açıklama


Üye


$.name


Bir alana ada göre erişin


Üye (özel karakterler)


$."phone#"


Özel karakter içeren adlar için tırnak işaretini kullanın


Joker üye


$.*


Bir nesnenin tüm alanları


Öğe


$.phones[1]


Dizine göre dizi öğesi


Öğe aralığı


$.phones[0, 1] veya $[1, 2, 4 to 7]


Belirtilen dizinlerdeki öğeler veya bir aralık


Joker öğe


$.phones[*]


Tüm dizi öğeleri

Modlar:

JSON Yolu iki modu destekler. Varsayılan lax modudur.


Mod


Davranış


Sütun budama


lax


Yol farklı bir yapı beklediğinde skalerleri otomatik olarak diziye sarar ve dizileri nesnelere açar. Sonuçları esnek şekilde döndürür.


Desteklenmez


strict


Yol gerçek veri yapısıyla tam olarak eşleşmiyorsa NULL döndürür.


Desteklenir

lax modu örnekleri (yukarıdaki örnek veriler kullanılarak):


İfade


Sonuç


Neden


lax $.phones.phonetype


["work","cell"]


phones dizisini açar ve her nesneden phonetype okur


lax $.phones[*].phonetype


["work","cell"]


Doğrudan joker öğe erişimi


lax $.name[*]


["Molly"]


"Molly" dizesini bir diziye sarar


lax $.name.*


NULL


name altında bir nesne bekler, ancak bir dize bulur

strict modu örnekleri:


İfade


Sonuç


Neden


strict $.phones[1]."phone#"


"650-555-5555"


Tam yol eşleşmesi


strict $.phones.phonetype


NULL


phones bir dizidir; bir nesne beklenir


strict $.address


NULL


Alan mevcut değil

Önemli

Sütun budamaya ihtiyaç duyduğunuzda strict modunu kullanın. Lax modu sütun budama optimizasyonunu desteklemez.

Tasarım hususları

  • Sütun budama için strict modunu kullanın. Lax modu sütun budama optimizasyonunu tetiklemez, bu nedenle lax modundaki sorgular daha fazla veri tarar.

  • JSON belgelerini küçük tutun. Her JSON sütunu tek bir sütun değeri olarak depolanır. Büyük belgeler satır başına bellek ve G/Ç maliyetini artırır.

  • Alım öncesinde doğrulayın. json_parse() çağrısından önce hatalı biçimlendirilmiş satırları filtrelemek için json_valid() kullanın.

  • Büyük sayıları eklemeden önce hassasiyeti kontrol edin. JSON sayıları BIGINT (tam sayı kısmı) ve DOUBLE (ondalık kısım) olarak depolanır. Bu aralıkların dışındaki sayılar taşmaya uğrar.

  • Tabloları oluşturmadan önce şemanızı planlayın. Mevcut bir tabloya JSON sütunu ekleyemezsiniz. Tabloyu başlangıçta JSON sütunu ile tasarlayın.

Uçtan uca örnek

-- Enable the JSON type if your project was created before the feature was enabled.
SET odps.sql.type.json.enable=true;

-- Create a JSON table.
CREATE TABLE orders (record JSON);

-- Ingest from a staging STRING table, skipping malformed rows.
CREATE TABLE staging (raw_json STRING);
INSERT INTO staging VALUES ('{"id": 1001, "customer": "Molly", "amount": 299.50}');

INSERT INTO orders
SELECT json_parse(raw_json)
FROM   staging
WHERE  json_valid(raw_json);

-- Query all non-null records.
SELECT * FROM orders WHERE record IS NOT NULL;
-- Returns:
-- +--------------------------------------------------+
-- | record                                           |
-- +--------------------------------------------------+
-- | {"id":1001,"customer":"Molly","amount":299.5}    |
-- +--------------------------------------------------+

-- Access a specific field.
SELECT record['customer'] FROM orders WHERE record IS NOT NULL;
-- Returns:
-- +-----------+
-- | _c0       |
-- +-----------+
-- | "Molly"   |
-- +-----------+

Sonraki adımlar

  • JSON işlevleri — JSON_EXTRACT, GET_JSON_OBJECT, JSON_OBJECT, JSON_ARRAY, json_parse, json_valid ve ilgili işlevler için tam referans

  • CAST ifadeleri — JSON için tür dönüştürme davranışı