Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Feature: Schemaless Query

Son Güncelleme:Oct 04, 2026

MaxCompute, OSS üzerindeki Parquet harici tablolarında şemasız sorguları destekler. Ayrıştırılan veri kümesini OSS'e dışa aktarabilir, dahili bir tabloya yazabilir veya esnek veri gölü işleme için SQL işlemlerinde alt sorgu olarak kullanabilirsiniz.

Arka plan bilgileri

Spark ile yapılandırılmış verilerin geçici keşfi sabit bir veri ambarı modeli gerektirmez. Ancak, OSS'ten okuma veya yazma yapmadan önce tablo şemalarını tanımlamak ve dosya alanlarını manuel olarak eşlemek bölüm yönetimini zahmetli ve esnek olmayan hale getirir.

LOAD yönergesiyle MaxCompute, Parquet dosyalarını otomatik olarak ayrıştırır ve verileri şema farkındalığına sahip bir veri kümesi olarak okur. Bu veri kümesinden belirli sütunları doğrudan seçerek tablo işlemlerine benzer şekilde işleyebilirsiniz. Sonuçları OSS'e dışa aktarmak için UNLOAD komutunu veya bunları dahili bir tabloya aktarmak için CREATE TABLE AS deyimini kullanın. Veri kümesi, veri gölü verilerinde esnek işlemler için diğer SQL deyimlerinde alt sorgu olarak da hizmet edebilir.

Uygulanabilirlik

  • Şemasız Sorgu, OSS paketindeki alt dizinlerin bölüm olarak değerlendirilmesini desteklemez.

  • JSON biçimli veriler için yalnızca JSONL desteklenir.

Sözdizimi

SELECT *, <col_name>, <table_alias>.<col_name> 
FROM 
 LOCATION '<location_path>'  
 ('key'='value' [, 'key1'='value1', ...]) 
 [AS <table_alias>];

Parametre açıklamaları

Parametre

Gerekli

Açıklama

*

Evet

Dosyadaki tüm alanları sorgular.

col_name

Evet

Dosyadaki sütun adına göre bir alanı sorgular.

DECIMAL türü yalnızca precision <=38 && scale<=18 değerlerini destekler.

table_alias.col_name

Evet

Tablo takma adı ve sütun adının tam nitelikli yolunu kullanarak sütun adına göre bir alanı sorgular.

table_alias

Hayır

Özel tablo takma adı.

location_path

Evet

  • Dosyanın konumu. oss://oss_endpoint/bucket_name/path/ biçiminde bir OSS dizini olmalıdır.

  • Yolun altındaki bir sonraki düzey, partition_name=partition_value biçimindeki bölüm dizinlerini destekler.

  • Şemasız Sorgu, konumdaki alt dizinlerin bölüm olarak değerlendirilmesini desteklemediğinden bölüm budama desteklenmez.

key&value

Evet

Sorgu deyimi için parametreler ve değerleri. Ayrıntılar için aşağıdaki tabloya bakın.

Anahtar-değer parametre tablosu

Anahtar

Gerekli

Açıklama

Değer

Varsayılan

file_format

Evet

Konumdaki dosya biçimi. Yalnızca Parquet ve JSON desteklenir. Diğer biçimler hata döndürür.

parquet、json

parquet

rolearn

Hayır

Konuma erişmek için gereken RoleARN.

  • RAM konsolu içinde oturum açın.

  • Sol gezinme bölmesinde Identities > Roles seçeneğini belirleyin.

  • Basic Information bölümünde ARN değerini alabilirsiniz.

Not

SQL ifadesinde bir RoleARN belirtmezseniz sistem AliyunODPSDefaultRole rolünün ARN değerini kullanır.

acs:ram::xxxxxx:role/aliyunodpsdefaultrole

acs:ram::1234****:role/aliyunodpsdefaultrole

file_pattern_blacklist

Hayır

Hariç tutulacak dosyaların engelleme listesi. Adı desene uyan dosyalar okunmaz.

"._SUCCESS$,.\\.hive_staging.*"

Yok

file_pattern_whitelist

Hayır

Dahil edilecek dosyaların izin listesi. Yalnızca adı desene uyan dosyalar okunur.

"._20250124_..parquet"

.*

Örnekler

Örnek 1: Engelleme ve izin listesi parametrelerini kullanarak OSS verilerini okuma

  1. Verileri hazırlayın.

    1. OSS konsolu içinde oturum açın.

    2. Sol gezinme bölmesinde Buckets öğesini tıklayın.

    3. Buckets sayfasında Create Bucket öğesini tıklayın.

    4. OSS paket dizini object-table-test/schema/ oluşturun.

    5. Okuma ve izin listesi doğrulaması için bir Parquet dosyası hazırlayın. Dosyayı oluşturmak üzere aşağıdaki Python kodunu yerel olarak çalıştırın.

      import pandas as pd
      # Sample data
      data = [
          {'id': 3, 'name': 'Charlie', 'age': 35},
          {'id': 4, 'name': 'David', 'age': 40},
          {'id': 5, 'name': 'Eve', 'age': 28}
      ]
      df = pd.DataFrame(data)
      df['id'] = df['id'].astype('int32')
      df['name'] = df['name'].astype('str')
      df['age'] = df['age'].astype('int32')
      output_filename = 'sample_data.parquet'
      df.to_parquet(output_filename, index=False, engine='pyarrow')
      
    6. Parquet dosyasını object-table-test/schema/ OSS paket dizinine yükleyin.

      1. OSS konsolu içinde oturum açın.

      2. object-table-test/schema/ paket dizininde Upload File öğesini tıklayın.

    7. Engelleme listesi parametresini doğrulamak üzere object-table-test/schema/ OSS paket dizininde bir CSV dosyası hazırlayın.

  2. Parquet dosyasını okuyun.

    MaxCompute istemcisine (odpscmd) giriş yapın ve aşağıdaki SQL komutlarını çalıştırın.

    • test_oss.csv öğesini engelleme listesine ekleyin ve Parquet dosyasını OSS'ten okuyun.

      SELECT id, name, age 
      FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/'
      (
      'file_format'='parquet',
      'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
      'file_pattern_blacklist'='.*test_oss.*'
      );
    • sample_data öğesini izin listesine ekleyin ve Parquet dosyasını OSS'ten okuyun.

      SELECT id, name, age 
      FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/'
      (
      'file_format'='parquet',
      'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
      'file_pattern_whitelist'='.*sample_data.*'
      );

    Her iki durumda da sample_data dosyası okunur. Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

Örnek 2: Spark tarafından yazılan verileri okuma

  1. OSS paket dizini object-table-test/spark/ oluşturun.

  2. Serverless Spark kullanarak Parquet verileri oluşturun. Daha fazla bilgi için bkz. SQL işi oluşturma. OSS dizininde zaten Spark tarafından yazılmış Parquet dosyaları varsa bu adımı atlayın.

    1. E-MapReduce konsolu içinde oturum açın ve sol üst köşeden bir bölge seçin.

    2. Sol gezinme bölmesinde EMR Serverless > Spark seçeneğini belirleyin.

    3. Spark sayfasında hedef çalışma alanınızın adını tıklayarak açın. Alternatif olarak Create Workspace öğesini tıklayın. Yeni çalışma alanı oluşturulduktan sonra açmak için adını tıklayın.

    4. Sol gezinme bölmesinde Data Development seçeneğini belirleyin ve ardından aşağıdaki SQL deyimlerini çalıştırmak için bir Spark SQL dosyası oluşturun:

      CREATE TABLE example_table_parquet04 (
          id STRING,
          name STRING,
          age STRING,
          salary DOUBLE,
          is_active BOOLEAN,
          created_at TIMESTAMP,
          details STRUCT<department:STRING, position:STRING>
      )
      USING PARQUET;
      INSERT INTO example_table_parquet04 VALUES
      ('1', 'Alice', '30', 5000.50, TRUE, TIMESTAMP '2024-01-01 10:00:00', STRUCT('HR', 'Manager')),
      ('2', 'Bob', '25', 6000.75, FALSE, TIMESTAMP '2024-02-01 11:00:00', STRUCT('Engineering', 'Developer')),
      ('3', 'Charlie','35', 7000.00, TRUE, TIMESTAMP '2024-03-01 12:00:00', STRUCT('Marketing', 'Analyst')),
      ('4', 'David', '40', 8000.25, FALSE, TIMESTAMP '2024-04-01 13:00:00', STRUCT('Sales', 'Representative')),
      ('5', 'Eve', '28', 5500.50, TRUE, TIMESTAMP '2024-05-01 14:00:00', STRUCT('Support', 'Technician'));
      SELECT * FROM example_table_parquet04;
  3. OSS konsoluna giriş yapın ve hedef yoldaki oluşturulan veri dosyalarını görüntüleyin.

  4. MaxCompute istemcisine giriş yapın, _SUCCESS öğesini engelleme listesine ekleyin ve Parquet dosyasını OSS'ten okuyun.

    SELECT  *
    FROM location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/spark/example_table_parquet04/'
    (
    'file_format'='parquet',
    'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole',
    'file_pattern_blacklist'='.*_SUCCESS.*'
    );

    Aşağıdaki sonuç döndürülür:

    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
    | id | name    | age | salary     | is_active | created_at          | details                                      |
    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
    | 1  | Alice   | 30  | 5000.5     | true      | 2024-01-01 10:00:00 | {department:HR, position:Manager}            |
    | 2  | Bob     | 25  | 6000.75    | false     | 2024-02-01 11:00:00 | {department:Engineering, position:Developer} |
    | 3  | Charlie | 35  | 7000.0     | true      | 2024-03-01 12:00:00 | {department:Marketing, position:Analyst}     |
    | 4  | David   | 40  | 8000.25    | false     | 2024-04-01 13:00:00 | {department:Sales, position:Representative}  |
    | 5  | Eve     | 28  | 5500.5     | true      | 2024-05-01 14:00:00 | {department:Support, position:Technician}    |
    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+

Şemasız Sorgu işlemleri hakkında daha fazla bilgi için bkz. Şemasız Sorgu kullanarak veri gölünden Parquet verilerini okuma.

Örnek 3: Alt sorguda Şemasız Sorgu kullanma

  1. Verileri hazırlayın.

    OSS konsoluna giriş yapın ve test dosyası part-00001.snappy.parquet öğesini OSS paket dizini object-table-test/schema/ konumuna yükleyin. Daha fazla bilgi için bkz. OSS dosyaları yükleme.

  2. MaxCompute istemcisine giriş yapın ve OSS'ten otomatik olarak keşfedilen verileri depolamak için dahili bir tablo oluşturun.

    CREATE TABLE ow_test (
        id INT,
        name STRING,
        age INT
    );
  3. Şemasız Sorgu kullanarak OSS'ten verileri okuyun.

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  4. OSS verilerini dıştaki bir SQL deyimine alt sorgu olarak kullanarak ow_test tablosuna ekleyin.

    INSERT OVERWRITE TABLE ow_test
    SELECT id,name,age FROM 
    (
        SELECT * FROM 
        LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
        (
          'file_format'='parquet'
        )
    );
    SELECT * FROM ow_test;

    Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

Örnek 4: Şemasız Sorgu sonuçlarını dahili bir veri ambarı tablosuna kaydetme

  1. Verileri hazırlayın.

    OSS konsoluna giriş yapın ve test dosyası part-00001.snappy.parquet öğesini OSS paket dizini object-table-test/schema/ konumuna yükleyin. Daha fazla bilgi için bkz. OSS dosyaları yükleme.

  2. MaxCompute istemcisine giriş yapın ve Şemasız Sorgu kullanarak OSS'ten verileri okuyun.

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. Otomatik olarak keşfedilen OSS verilerini dahili bir tabloya kopyalamak için CREATE TABLE AS deyimini kullanın, ardından sonucu görüntülemek için tabloyu sorgulayın.

    CREATE TABLE ow_test_2 AS 
      SELECT * FROM 
      LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
      (
        'file_format'='parquet'
       );
    -- Query the result table ow_test_2
    SELECT * FROM ow_test_2;

    Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+

Örnek 5: Şemasız Sorgu sonuçlarını veri gölüne geri UNLOAD etme

  1. Verileri hazırlayın.

    OSS konsoluna giriş yapın ve test dosyası part-00001.snappy.parquet öğesini OSS paket dizini object-table-test/schema/ konumuna yükleyin. Daha fazla bilgi için bkz. OSS dosyaları yükleme.

  2. MaxCompute istemcisine giriş yapın ve Şemasız Sorgu kullanarak OSS'ten verileri okuyun.

    SELECT * FROM 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
    (
      'file_format'='parquet'
    );

    Aşağıdaki sonuç döndürülür:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. Otomatik olarak keşfedilen sonuçları OSS'e dışa aktarmak için UNLOAD komutunu kullanın. Daha fazla bilgi için bkz. UNLOAD.

    UNLOAD FROM (
      SELECT * FROM 
      LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/schema/' 
      ('file_format'='parquet')
    ) 
    INTO 
    LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/unload/ow_test_3/'
    ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
    WITH SERDEPROPERTIES ('odps.external.data.enable.extension'='true')
    STORED AS PARQUET;

    OSS dizininde oluşturulan dosyayı görüntüleyin: Komut başarıyla çalıştıktan sonra unload/ow_test_3/ OSS yolunda 20250715070650775g0etr15glr2_M1_1_0_0-0_TableSink1.parquet Parquet dosyası oluşturulur. Dosya boyutu 0,449 KB'dir ve depolama sınıfı Standart'tır.

Örnek 6: JSON biçimli verileri okuma

Yalnızca JSONL dosyaları desteklenir.

  1. JSONL test verilerini OSS'e yükleyin. sample_data.jsonl

  2. Şemasız Sorgu kullanarak sample_data.jsonl dosyasını okuyun.

    SELECT  *
    FROM location 'oss://oss-<region>-internal.aliyuncs.com/<path>'
    (
        'file_format'='json',
        'rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
    );