Tüm Ürünler
Search
Belge Merkezi

MaxCompute:JSON external table

Son Güncelleme:Oct 04, 2026

Bu konuda, OSS içindeki bir JSON harici tablonun nasıl oluşturulacağı, okunacağı ve yazılacağı açıklanmaktadır.

Kapsam

İ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.rolearn parametresinde 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ğerini odps.properties.rolearn parametresinde 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. True olarak ayarlandığında MaxCompute, OSS'ye yazarken TEXTFILE verilerini sıkıştırır.

  • True

  • False

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 .deflate kodlayıcısı kullanılarak sıkıştırılır.

Not: Yalnızca property_value içindeki sıkıştırma yöntemi desteklenir.

  • com.hadoop.compression.lzo.LzoCodec

  • com.hadoop.compression.lzo.LzopCodec

  • org.apache.hadoop.io.compress.SnappyCodec

  • org.apache.hadoop.io.compress.BZip2Codec

  • org.apache.hadoop.io.compress.Lz4Codec

  • org.apache.hadoop.io.compress.DeflateCodec

  • org.apache.hadoop.io.compress.GzipCodec

  • org.apache.hadoop.io.compress.odps.ZstandardCodec

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.

  • Ön ek yalnızca rakamlar (0-9), harfler (a-z, A-Z) ve alt çizgiler (_) içerebilir.

  • Ön ekin uzunluğu 1 ila 10 karakter arasında olmalıdır.

mc_ gibi geçerli bir karakter kombinasyonu.

Yok

odps.external.data.enable.extension

Çıkış dosyalarının adlarına bir dosya uzantısı eklemek için.

True olarak ayarlandığında çıkış dosyalarının adlarına bir dosya uzantısı eklenir. Aksi takdirde dosya uzantısı eklenmez.

  • True

  • False

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.

  • Uzantı yalnızca rakamlar (0-9), harfler (a-z, A-Z) ve alt çizgiler (_) içerebilir.

  • Dosya uzantısının uzunluğu 1 ila 10 karakter arasında olmalıdır.

  • odps.external.data.enable.extension parametresini geçersiz kılar.

jsonl gibi geçerli bir karakter kombinasyonu.

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 : veya , özel karakterleri bulunduğunda bu özelliği ekleyin.

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: ':,'

  • Varsayılan olarak anahtarlar ve değerler arasında sınırlayıcı olarak ':' kullanılır.

  • Farklı anahtar-değer çiftleri arasında sınırlayıcı olarak virgül ',' kullanılır.

  • Ayrıştırma sırasında anahtarların ve değerlerin başındaki ve sonundaki boşluklar kırpılır.

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.

  • rigid: Satır atlama mantığını zorlar. Bu ayar, oturum düzeyindeki veya proje düzeyindeki yapılandırmalar tarafından geçersiz kılınamaz.

  • flexible: Veri katmanında esnek atlamayı etkinleştirir. Bu ayar, oturum düzeyindeki veya proje düzeyindeki yapılandırmalar tarafından geçersiz kılınabilir.

İç 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_object gibi işlevleri kullanarak dahili alt alanların içeriğini gerektiği şekilde çıkarın.

  • STRUCT tü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 sayede field_name.subfield_name sö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

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.skipping

    • rigid: 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/project düzeyi parametreleri

    • odps.sql.unstructured.text.bad.row.skipping parametresi flexible tablo düzeyi parametresini geçersiz kılabilir ancak rigid parametresini 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

  1. 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.

  2. 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.
    );
  3. 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 exception

    Esnek 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 exception

    Katı 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

  1. Bir MaxCompute projesi oluşturdunuz.

  2. 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.
  3. İzinleri verme.

    1. 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.

    2. 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.

  1. 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.

  2. 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/';
  3. 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;
  4. 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   |
    +------------+------------+------------+
  5. JSON harici tablosuna veri yazın.

    INSERT INTO mc_oss_extable_name_json PARTITION (dt='20250526') VALUES ('test','1627273823');
  6. 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

  1. Yalnızca tek bir string tü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"} |
    +------------------------------------+
  2. get_json_object işlevini kullanarak a ve id alanları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 |
    +-------------------+-----+
  3. İç içe geçmiş x, y ve id alanları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

  1. JSON biçimli bir harici tablo oluşturun ve iç içe geçmiş alanları almak için STRUCT tü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/';          
  2. 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 |
    +----------+-----+
  3. get_json_object ve TO_JSON işlevlerini kullanarak x ve y alanları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

  1. 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ğin test06_202509101.

  2. OSS'ye yazılan dosyalar için özel son eki _beijing olarak ö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');
  3. Çı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');
  4. OSS'ye yazılan dosyalar için dosya uzantısını jsonl olarak ö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.

  5. OSS'ye yazılan dosyalar için ön eki mc_, son eki _beijing ve dosya uzantısını jsonl 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'='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; burada 20250905073013526 sistem 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).


Tür


Destekleniyor


Tür


Destekleniyor


TINYINT


Evet


STRING


Evet


SMALLINT


Evet


DATE


Evet


INT


Evet


DATETIME


Hayır


BIGINT


Evet


TIMESTAMP


Hayır


BINARY


Hayır


TIMESTAMP_NTZ


Evet


FLOAT


Evet


BOOLEAN


Evet


DOUBLE


Evet


ARRAY


Evet


DECIMAL(precision, scale)


Evet


MAP


Evet


VARCHAR(n)


Evet


STRUCT


Evet


CHAR(n)


Evet


JSON


Hayır

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.


Sıkıştırma özelliği


Okuma


Yazma


Gzip


Evet


Evet


BZip2


Evet


Evet


Deflate


Evet


Evet


ZSTD


Evet


Evet


SNAPPY(SnappyRawCodec)


Evet


Hayır


SNAPPY(SnappyCodec)


Evet


Evet

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

Evet

  • Yeni bir sütunun sırasını belirtemezsiniz. Varsayılan olarak son sütun olarak eklenir.

  • Yeni eklenen normal sütunlar için varsayılan değerler yalnızca MaxCompute tarafından yazılan veriler için geçerlidir.

  • Değiştirilen şemaya uyan veriler doğru şekilde okunabilir.

  • Eski şemayı kullanan mevcut veriler yeni şemaya göre okunur.

    Örnek: Yeni sütunu içermeyen geçmiş verileri okurken MaxCompute bu sütunu NULL ile doldurur.

Sütun silme

Evet

JSON harici tabloları sütunları ada göre eşler.

Uyumlu

Sütun sırasını değiştirme

Evet

JSON harici tabloları sütunları ada göre eşler.

Uyumlu

Sütun veri türünü değiştirme

Evet

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

Hayır

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.

  • Değiştirilen şemaya uyan veriler doğru şekilde okunabilir.

  • Eski şemayı kullanan mevcut veriler yeni şemaya göre okunur.

    Örnek: Bir sütunu yeniden adlandırdıktan sonra JSON dosyasındaki karşılık gelen anahtar yeniden adlandırılmazsa tabloyu okuduğunuzda sütun NULL döndürür.

Sütun açıklamasını değiştirme

Evet

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

Hayır

Bu işlem desteklenmez. Sütunlar varsayılan olarak null kabul edilir.

Geçerli değil