Bu konuda, OSS içindeki bir JSON harici tablonun nasıl oluşturulacağı, okunacağı ve yazılacağı açıklanmaktadır.
Kapsam
OSS harici tablolar küme özelliğini desteklemez.
Tek bir dosyanın boyutu 2 GB'ı aşamaz. 2 GB'tan büyük dosyaları bölmeniz gerekir.
MaxCompute ve OSS aynı bölgede olmalıdır.
İzin açıklaması
OSS harici tablolarına erişirken, bir Alibaba Cloud hesabı, RAM kullanıcısı veya RAM rolü kullanıyor olmanızdan bağımsız olarak verilere
odps.properties.rolearnparametresinde belirtilen rol aracılığıyla erişilir. Bu nedenle, bir RAM rolü oluşturmanız ve bu role hedef OSS paketinde erişim izni vermeniz, ardından rolün ARN değeriniodps.properties.rolearnparametresinde yapılandırmanız gerekir. Daha fazla bilgi için bkz. Parametreler.İş gereksinimlerinize göre aynı hesap içi veya hesaplar arası erişimi yetkilendirebilirsiniz. Daha ayrıntılı erişim denetimi için özel bir yetkilendirme ilkesi kullanmanızı öneririz. Daha fazla bilgi için bkz. Harici veri kaynakları için yetkilendirme.
Harici tablo oluşturma
Sözdizimi
Bir JSON dosyasında harici tablo tanımından daha az sütun varsa MaxCompute eksik sütunları NULL ile doldurur. Dosyada daha fazla sütun varsa MaxCompute ek sütunları atar.
Basitleştirilmiş sözdizimi
CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
STORED AS textfile
LOCATION '<oss_location>';
Tam sözdizimi
CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
[WITH serdeproperties (
['<property_name>'='<property_value>',...])
]
STORED AS textfile
LOCATION '<oss_location>'
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];
Ortak parametreler
Daha fazla bilgi için bkz. Ortak sözdizimi parametreleri.
Özel parametreler
Tblproperties parametreleri
Parametre | Kullanım durumu | Açıklama | Değer | Varsayılan |
mcfed.mapreduce.output.fileoutputformat.compress | TEXTFILE verilerini OSS'ye sıkıştırılmış biçimde yazmak için. | TEXTFILE sıkıştırma özelliği. |
| False |
mcfed.mapreduce.output.fileoutputformat.compress.codec | TEXTFILE verilerini OSS'ye sıkıştırılmış biçimde yazmak için. | TEXTFILE sıkıştırma özelliği. TEXTFILE veri dosyaları için sıkıştırma kodlayıcısını ayarlar. Varsayılan olarak dosyalar Not: Yalnızca |
| org.apache.hadoop.io.compress.DeflateCodec |
odps.external.data.output.prefix (odps.external.data.prefix ile geriye dönük uyumlu) | Çıkış dosyalarının adlarına özel bir ön ek eklemek için. |
|
| Yok |
odps.external.data.enable.extension | Çıkış dosyalarının adlarına bir dosya uzantısı eklemek için. |
|
| False |
odps.external.data.output.suffix | Çıkış dosyalarının adlarına özel bir son ek eklemek için. | Son ek yalnızca rakamlar (0-9), harfler (a-z, A-Z) ve alt çizgiler (_) içerebilir. | '_hangzhou' gibi geçerli bir dize. | Yok |
odps.external.data.output.explicit.extension | Çıkış dosyalarının adlarına özel bir dosya uzantısı eklemek için. |
|
| Yok |
odps.ext.column.mapping | OSS veri dosyalarındaki alan adlarında özel karakterler bulunduğunda bu özelliği ekleyin. | Bu özellik özel sütun adı eşlemelerini tanımlar. Örneğin, OSS dosya alanları id BIGINT, $_test DOUBLE ve =name STRING ise harici tabloyu oluştururken parametre değerini t_test:$_test,t_name:=_name olarak ayarlayın. Yalnızca özel karakter içeren alanlar için eşleme belirtmeniz gerekir. | Sabit değer yok | Yok |
odps.ext.column.mapping.delimiters (Yalnızca sütun adlarındaki karakterler sütun adı eşlemelerindeki varsayılan sınırlayıcılarla çakıştığında kullanın. Genellikle önerilmez.) | Sütun adlarında | Bu özellik, anahtar-değer çiftleri için grup içi ve gruplar arası sınırlayıcıları özelleştirir. Değer tam olarak iki karakter içermelidir: ilk karakter anahtar-değer sınırlayıcısı olarak, ikinci karakter ise farklı anahtar-değer çiftleri arasındaki sınırlayıcı olarak işlev görür. | Sabit değer yok. Örnek: | Varsayılan değer:
|
odps.text.option.bad.row.skipping | OSS veri dosyalarındaki hatalı verileri atlamak için. | MaxCompute OSS dosyalarından okuma yaparken hatalı verilerin atlanıp atlanmayacağını belirtir. |
|
İç içe geçmiş nesneler (structs) içeren JSON için harici bir tablo oluştururken nesne alanının veri türünü STRING veya JSON olarak tanımlamayın. Aksi takdirde MaxCompute alt alanlarını ayrıştıramaz.
Aşağıdaki iki yaklaşım önerilir. Ayrıntılı adımlar için bu konudaki örneklere bakın:
Alanı STRING olarak tanımlayın ve sorgularınızda
get_json_objectgibi işlevleri kullanarak dahili alt alanların içeriğini gerektiği şekilde çıkarın.STRUCTtürünü kullanarak alanı yapısal olarak tanımlayın ve JSON nesnesinin her bir alt alanını ayrı bir alt sütuna eşleyin. Bu sayedefield_name.subfield_namesözdizimini kullanarak doğrudan dahili verilere erişebilirsiniz.
İzin listesi ve engelleme listesi
MaxCompute OSS harici tabloları izin listesi ve engelleme listesi filtrelemeyi destekler. tblproperties içinde izin listesi ve engelleme listesi parametrelerini ayarlayarak bir dizinden hangi dosyaların okunacağını filtreleyebilirsiniz. Ayrıntılar için bkz. İzin listesi ve engelleme listesi.
Veri yazma
MaxCompute'dan OSS'ye veri yazmaya ilişkin sözdizimi hakkında bilgi için bkz. OSS'ye veri yazma.
Veri sorgulama
SELECT sözdizimi hakkında bilgi için bkz. OSS'den veri okuma.
Sorgu planlarını optimize etme hakkında bilgi için bkz. Sorgu optimizasyonu.
BadRowSkipping hakkında daha fazla bilgi için bkz. BadRowSkipping.
BadRowSkipping
BadRowSkipping özelliği, hatalı veri içeren veya ayrıştırma hatalarına neden olan satırları atlamanıza olanak tanır. Altta yatan veri biçiminin nasıl yorumlandığını değiştirmez.
Parametreler
-
Tablo düzeyi parametresi:
odps.text.option.bad.row.skippingrigid: Atlamayı zorlar. Bu ayar, oturum düzeyindeki veya proje düzeyindeki yapılandırmalar tarafından geçersiz kılınamaz.flexible: Atlamayı etkinleştirir. Bu ayar esnektir, oturum düzeyindeki veya proje düzeyindeki yapılandırmalar tarafından geçersiz kılınmasına olanak tanır.
-
session/projectdüzeyi parametreleri-
odps.sql.unstructured.text.bad.row.skippingparametresiflexibletablo düzeyi parametresini geçersiz kılabilir ancakrigidparametresini geçersiz kılamaz.on: Özelliği etkinleştirir. Özellik tablo için yapılandırılmamışsa varsayılan olarak etkinleştirilir.off: Özelliği devre dışı bırakır. Tablo esnek olarak yapılandırılmışsa özellik devre dışı bırakılır. Aksi takdirde tablo parametresinin ayarı kullanılır.<null> or invalid input: Tablo düzeyi yapılandırması kullanılır.
-
odps.sql.unstructured.text.bad.row.skipping.debug.num: Logview'de stdout'a yazdırılacak hata sonuçlarının sayısını belirtir.Maksimum değer 1000'dir.
Değer <=0 ise bu özellik devre dışı bırakılır.
Değer geçersizse bu özellik devre dışı bırakılır.
-
-
Oturum düzeyi parametreleri ve tablo özellikleri arasındaki etkileşim
tbl özelliği
oturum bayrağı
sonuç
rigid
on
Açık, Zorla açık
off
<null>, geçersiz bir değer veya parametre yapılandırılmamış
flexible
on
Açık
off
Kapalı, Oturum tarafından devre dışı bırakıldı
<null>, geçersiz bir değer veya parametre yapılandırılmamış
Açık
Yapılandırılmadı
on
Açık, Oturum tarafından etkinleştirildi
off
Kapalı
<null>, geçersiz bir değer veya parametre yapılandırılmamış
Örnekler
-
Veri hazırlama
Bazı hatalı veriler içeren test verisi json_bad_row_skipping.json dosyasını OSS'deki
oss-mc-test/badrow/dizinine yükleyin. -
JSON harici tablosu oluşturma
Davranış, tablo düzeyi özelliğine ve oturum düzeyi bayrağına bağlı olarak değişir. Aşağıdaki üç durum mümkündür:
Tablo parametresi:
odps.text.option.bad.row.skipping = flexible/rigid/<belirtilmemiş>Oturum bayrağı:
odps.sql.unstructured.text.bad.row.skipping = on/off/<ayarlanmamış>
Tablo düzeyi özelliği yok
-- No table-level property is set. Errors are handled based on the session-level flag. CREATE EXTERNAL TABLE test_json_bad_data_skipping_flag ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>';Esnek atlama
-- The table-level property skips error rows, but the session-level flag can disable this behavior. CREATE EXTERNAL TABLE test_json_bad_data_skipping_flexible ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>' tblproperties ( 'odps.text.option.bad.row.skipping' = 'flexible' -- Flexible mode, can be disabled at the session level. );Katı atlama
-- The table-level property forces error skipping. This behavior cannot be disabled at the session level. CREATE EXTERNAL TABLE test_json_bad_data_skipping_rigid ( a INT, b INT ) row format serde 'org.apache.hive.hcatalog.data.JsonSerDe' stored AS textfile location '<oss://databucketpath>' tblproperties ( 'odps.text.option.bad.row.skipping' = 'rigid' -- Forced on. ); -
Sorgu sonuçlarını doğrulama
Tablo düzeyi özelliği yok
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_flag;Hata atlama oturum düzeyinde devre dışı bırakılırsa (
SET odps.sql.unstructured.text.bad.row.skipping=off), sorgu aşağıdaki hatayla başarısız olur: FAILED: ODPS-0123131:User defined function exceptionEsnek atlama
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_flexible;Hata atlama oturum düzeyinde devre dışı bırakılırsa (
SET odps.sql.unstructured.text.bad.row.skipping=off), sorgu aşağıdaki hatayla başarısız olur: FAILED: ODPS-0123131:User defined function exceptionKatı atlama
-- Enable at the session level. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Disable at the session level. If the table property is 'flexible', it will be disabled. If the table property is 'rigid', this setting has no effect. SET odps.sql.unstructured.text.bad.row.skipping=off; -- Print problematic rows. The maximum is 1,000. If the value is less than or equal to 0, printing is disabled. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=10; SELECT * FROM test_json_bad_data_skipping_rigid;Aşağıdaki sonuç döndürülür:
+------------+------------+ | a | b | +------------+------------+ | 1 | 2 | | 15 | 16 | +------------+------------+
Örnekler
Ön koşullar
-
Bir OSS paketi ve dizini hazırladınız. Daha fazla bilgi için bkz. Paket oluşturma ve Dizinleri yönetme.
Paketinizin MaxCompute projenizle aynı bölgede olduğundan emin olun.
-
İzinleri verme.
OSS'ye erişim izniniz var. Bir OSS harici tablosuna bir Alibaba Cloud hesabı, RAM kullanıcısı veya RAM rolü kullanarak erişebilirsiniz. İzinlerin nasıl verileceği hakkında daha fazla bilgi için bkz. OSS için STS modu yetkilendirmesi.
MaxCompute projesinde CreateTable izniniz var. Tablo ile ilgili izinler hakkında daha fazla bilgi için bkz. MaxCompute izinleri.
Örnek 1: JSON tablosu oluşturma, yazma ve sorgulama
Bu örnekte yerleşik açık kaynak veri ayrıştırıcısı kullanılarak bir JSON harici tablosunun nasıl oluşturulacağı, OSS'ye nasıl veri yazılacağı ve verilerin nasıl sorgulanacağı gösterilmektedir.
-
Veri hazırlama.
OSS konsolu üzerinde oturum açın ve test verisi dosyası json2025.txt dosyasını bir OSS Paketindeki
external-table-test/json/dt=20250521/dizinine yükleyin. Daha fazla bilgi için bkz. OSS'ye dosya yükleme. -
JSON harici tablosu oluşturun.
CREATE EXTERNAL TABLE mc_oss_extable_name_json ( action STRING, time STRING ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json/'; -
OSS harici tablonuz bölümlemeli bir tabloyla bölümlenmiş verileri de içeri aktarmanız gerekir. Daha fazla bilgi için bkz. OSS harici tablosu.
-- Add partitions. MSCK REPAIR TABLE mc_oss_extable_name_json ADD PARTITIONS; -
JSON harici tablosundan veri okuyun.
SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | action | time | dt | +------------+------------+------------+ | Close | 1469679568 | 20250526 | | Close | 1469679568 | 20250526 | +------------+------------+------------+ -
JSON harici tablosuna veri yazın.
INSERT INTO mc_oss_extable_name_json PARTITION (dt='20250526') VALUES ('test','1627273823'); -
Yazılan verileri görüntüleyin.
SELECT * FROM mc_oss_extable_name_json WHERE dt=20250526;Aşağıdaki sonuç döndürülür:
+------------+------------+------------+ | action | time | dt | +------------+------------+------------+ | test | 1627273823 | 20250526 | | Close | 1469679568 | 20250526 | | Close | 1469679568 | 20250526 | +------------+------------+------------+
Örnek 2: İç içe geçmiş JSON alanlarını okuma
Veri hazırlama
events.json JSON dosyasını oluşturun:
{"a":{"x":1, "y":2}, "id":"123"}
{"a":{"x":3, "y":4}, "id":"345"}
OSS konsolu üzerinde oturum açın ve test verilerini bir OSS paketindeki external-table-test/json_struct/ dizinine yükleyin. Daha fazla bilgi için bkz. OSS'ye dosya yükleme.
Yöntem 1: TEXTFILE harici tablosu oluşturun ve alan değerlerini okumak için get_json_object işlevini kullanın
-
Yalnızca tek bir
stringtürü sütunu içeren bir TEXTFILE harici tablosu oluşturun:CREATE EXTERNAL TABLE extable_json_test01 ( col STRING ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\n' STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/'; SELECT * FROM extable_json_test01;Aşağıdaki sonuç döndürülür:
+------------------------------------+ | col | +------------------------------------+ | {"a": {"x": 1, "y": 2},"id":"123"} | | {"a": {"x": 3, "y": 4},"id":"345"} | +------------------------------------+ -
get_json_objectişlevini kullanarakaveidalanlarını okuyun:SELECT get_json_object(col, '$.a') AS a, get_json_object(col, '$.id') AS id FROM extable_json_test01;Aşağıdaki sonuç döndürülür:
+-------------------+-----+ | a | id | +-------------------+-----+ | {"x":1,"y":2} | 123 | | {"x":3,"y":4} | 345 | +-------------------+-----+ -
İç içe geçmiş
x,yveidalanlarını okuyun:SELECT get_json_object(get_json_object(col,'$.a'),'$.x') AS x, get_json_object(get_json_object(col,'$.a'),'$.y') AS y, get_json_object(col,'$.id') AS id FROM extable_json_test01;Aşağıdaki sonuç döndürülür:
+---+---+-----+ | x | y | id | +---+---+-----+ | 1 | 2 |123 | | 3 | 4 |345 | +---+---+-----+
Yöntem 2: JSON harici tablosu oluşturun ve verileri almak için STRUCT türünü kullanın
-
JSON biçimli bir harici tablo oluşturun ve iç içe geçmiş alanları almak için
STRUCTtürünü kullanın:CREATE EXTERNAL TABLE extable_json_test02 ( a STRUCT<x: BIGINT, y: BIGINT>, id STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/json_struct/'; -
Tablodaki verileri doğrudan sorgulayın:
SELECT * FROM extable_json_test02;Aşağıdaki sonuç döndürülür:
+----------+-----+ | a | id | +----------+-----+ | {x:1, y:2}|123 | | {x:3, y:4}|345 | +----------+-----+ -
get_json_objectveTO_JSONişlevlerini kullanarakxveyalanlarını da okuyabilirsiniz:SELECT get_json_object(TO_JSON(a), '$.x') AS x, get_json_object(TO_JSON(a), '$.y') AS y, id FROM extable_json_test02;Aşağıdaki sonuç döndürülür:
+---+---+-----+ | x | y | id | +---+---+-----+ | 1 | 2 |123 | | 3 | 4 |345 | +---+---+-----+
Örnek 3: Çıkış dosya adlarını özelleştirme
-
OSS'ye yazılan dosyalar için özel ön eki
test06_olarak ayarlayın. DDL aşağıdaki gibidir:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom prefix. 'odps.external.data.output.prefix'='test06_') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Veri yazıldıktan sonra OSS'de oluşturulan dosyalar
test06_özel ön ekiyle adlandırılır, örneğintest06_202509101. -
OSS'ye yazılan dosyalar için özel son eki
_beijingolarak özelleştirmek için DDL aşağıdaki gibidir:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom suffix. 'odps.external.data.output.suffix'='_beijing') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW'); -
Çıkış dosyaları için otomatik olarak bir dosya uzantısı oluşturmak üzere aşağıdaki DDL'yi kullanın:
CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Automatically generate a file extension. 'odps.external.data.enable.extension'='true') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW'); -
OSS'ye yazılan dosyalar için dosya uzantısını
jsonlolarak özelleştirmek için DDL aşağıdaki gibidir:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom file extension. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Oluşturulan dosya adı
20250905072538695g3mlopvxicr4_M1_1_0_0-0_TableSink1.jsonlşeklindedir ve.jsonlözel dosya uzantısına sahiptir. -
OSS'ye yazılan dosyalar için ön eki
mc_, son eki_beijingve dosya uzantısınıjsonlolarak ayarlayın. DDL aşağıdaki gibidir:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- Add a custom prefix. 'odps.external.data.output.prefix'='mc_', -- Add a custom suffix. 'odps.external.data.output.suffix'='_beijing', -- Add a custom file extension. 'odps.external.data.output.explicit.extension'='jsonl') ; -- Write data to the external table. INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');Oluşturulan dosya adı
mc_20250905073013526gra1l214x6t6_M1_1_0_0-0_TableSink1_beijing.jsonlşeklindedir; burada20250905073013526sistem tarafından oluşturulan zaman damgasıdır ve orta kısım görev tanımlayıcısıdır.
SSS
Hata: Unexpected end-of-input: expected close marker for OBJECT
-
Hata mesajı
ODPS-0123131:User defined function exception - Traceback: com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: org.codehaus.jackson.JsonParseException: Unexpected end-of-input: expected close marker for OBJECT (from [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 0]) at [Source: java.io.ByteArrayInputStream@5a021cb9; line: 1, column: 3] at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122) at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152) at com.aliyun.odps.udf.HiveReaderHandler5c9b68c118d14fb2b392e8d916ddea8c.next(Unknown Source) -
Neden
Bu hata genellikle JSON Lines (JSONL) dosyası gibi geçersiz JSON verileriyle oluşur. Bir kayıt, satır başına bir kayıt kuralını ihlal eden kaçış karakteri olmayan yeni satır karakteri içeriyorsa hata tetiklenir.
-
Çözüm
JSON dosyasındaki yeni satır karakterlerini kaçış karakterleriyle işaretleyin ve ardından verileri okuyun.
-
Sorun giderme
BadRowSkipping'i etkinleştirdiğinizde atlanan satırlarla ilgili ayrıntılar Logview'deki stdout günlüğüne yazdırılır. Bu, veri hatalarını teşhis etmenize yardımcı olur. Bu özelliği etkinleştirmek için aşağıdaki ayarları kullanın:
-- Set the BadRowSkipping parameter to on at the session level to skip the error data. SET odps.sql.unstructured.text.bad.row.skipping=on; -- Specify the number of error records that can be printed to stdout in Logview. SET odps.sql.unstructured.text.bad.row.skipping.debug.num=<number>;
JSON harici tablosu okunurken izin listesi parametresi hatası: Start token not found where expected
-
Hata mesajı
FAILED: ODPS-0123131:User defined function exception - Traceback: com.aliyun.odps.serde.SerDeException: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:122) at com.aliyun.odps.udf.HiveReaderHandler.next(HiveReaderHandler.java:152) Caused by: org.apache.hadoop.hive.serde2.SerDeException: java.io.IOException: Start token not found where expected at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:190) at com.aliyun.odps.hive.wrapper.json.JsonEnhancedSerde.deserialize(JsonEnhancedSerde.java:50) at com.aliyun.odps.hive.wrapper.HiveSerDeWrapper.deserialize(HiveSerDeWrapper.java:120) ... 1 more Caused by: java.io.IOException: Start token not found where expected at org.apache.hive.hcatalog.data.JsonSerDe.deserialize(JsonSerDe.java:176) ... 3 more | fatalInstance: Odps/yyy_yueyi_dev_20251226063242326gd2yy12fi2h3_SQL_0_1_0_job_0/M1#0_0 -
Neden
İzin listesi parametrelerine göre eşleştirme yapılırken hiçbir dosya eşleşmiyor.
-
Çözüm
İzin listesi parametresindeki normal ifade deseninin doğru olduğunu doğrulayın.
Desteklenen veri türleri
MaxCompute veri türleri hakkında daha fazla bilgi için bkz. Veri türleri (Sürüm 1.0) ve Veri türleri (Sürüm 2.0).
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Desteklenen sıkıştırma biçimleri
Sıkıştırılmış dosyaları OSS'ye yazmak için tblproperties yan tümcesini ekleyin ve sıkıştırma özelliklerini yapılandırın. Daha fazla bilgi için bkz. TBLPROPERTIES parametreleri.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Dosya adlarında .bz2, .deflate, .snappy, .gz veya .zstd son eki bulunan sıkıştırılmış TEXTFILE dosyalarını okurken ek yapılandırma gerekmez.
Desteklenen şema evrimi
JSON harici tabloları tablo sütunlarını JSON alanlarıyla ada göre eşler.
Aşağıdaki tabloda, Veri uyumluluğu şema değişikliğinden sonra tablonun geçmiş verileri doğru şekilde okuyup okuyamadığını gösterir.
İşlem | Destekleniyor | Açıklama | Veri uyumluluğu |
Sütun ekleme |
|
| |
Sütun silme | JSON harici tabloları sütunları ada göre eşler. | Uyumlu | |
Sütun sırasını değiştirme | JSON harici tabloları sütunları ada göre eşler. | Uyumlu | |
Sütun veri türünü değiştirme | Desteklenen veri türü dönüşümleri hakkında bilgi için bkz. Sütun veri türünü değiştirme. | Uyumlu | |
Sütunu yeniden adlandırma | Bu işlem önerilmez. JSON harici tabloları sütunları ada göre eşler. Bir sütunu yeniden adlandırdıktan sonra JSON dosyasındaki sütun adı yeni şemayla eşleşmez ve bu durum okuma işlemlerinin başarısız olmasına neden olabilir. |
| |
Sütun açıklamasını değiştirme | Açıklama 1.024 baytı aşmayan geçerli bir dize olmalıdır. Aksi takdirde hata bildirilir. | Uyumlu | |
Sütunun null olmama özelliğini değiştirme | Bu işlem desteklenmez. Sütunlar varsayılan olarak null kabul edilir. | Geçerli değil |