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ğı
|
|
|
|
|
|
|
|
|
|
|
|
Ç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.inidosyasındause_instance_tunnel=falseayarı
JSON türünü etkinleştirin
odps.sql.type.json.enable bayrağı JSON türünün kullanılabilirliğini kontrol eder:
|
|
|
|
|
|
|
|
|
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ı
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Araç ve SDK gereksinimleri
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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)vejson_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:
|
|
|
|
|
|
|
|
|
|
|
|
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:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Modlar:
JSON Yolu iki modu destekler. Varsayılan lax modudur.
|
|
|
|
|
|
|
|
|
|
|
|
lax modu örnekleri (yukarıdaki örnek veriler kullanılarak):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
strict modu örnekleri:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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çinjson_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_validve ilgili işlevler için tam referansCAST ifadeleri — JSON için tür dönüştürme davranışı