All Products
Search
Document Center

MaxCompute:Fitur: Schemaless Query

Last Updated:Jun 21, 2026

MaxCompute mendukung kueri tanpa skema (schemaless) pada tabel eksternal Parquet di OSS. Anda dapat mengekspor set data yang telah diurai ke OSS atau menuliskannya ke tabel internal. Anda juga dapat menyematkan set data tersebut sebagai subkueri dalam operasi SQL untuk pemrosesan data lake yang fleksibel.

Informasi latar belakang

Saat menggunakan Spark untuk eksplorasi ad hoc terhadap data terstruktur, model gudang data tetap tidak diperlukan. Jika Anda harus mendefinisikan skema tabel dan memetakan bidang file secara manual sebelum membaca dari atau menulis ke OSS, pengelolaan partisi menjadi rumit dan tidak fleksibel.

Dengan instruksi LOAD, MaxCompute secara otomatis mengurai format file Parquet dan membaca data sebagai set data yang sadar skema. Anda kemudian dapat memilih kolom tertentu langsung dari set data ini untuk pemrosesan data yang mirip dengan operasi tabel. Hasilnya dapat diekspor langsung ke OSS menggunakan perintah UNLOAD, diimpor ke tabel internal melalui perintah CREATE TABLE AS, atau digunakan sebagai subkueri dalam pernyataan SQL lainnya—memungkinkan operasi MaxCompute yang fleksibel terhadap data di data lake.

Penerapan

Schemaless Query tidak mendukung perlakuan subdirektori dalam bucket OSS sebagai partisi.

Sintaks

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

Deskripsi parameter

Parameter

Wajib

Deskripsi

*

Ya

Menanyakan semua bidang dalam file Parquet.

col_name

Ya

Menanyakan suatu bidang berdasarkan nama kolom yang diketahui dalam file Parquet.

Tipe DECIMAL hanya mendukung precision <=38 && scale<=18.

table_alias.col_name

Ya

Menanyakan suatu bidang berdasarkan nama kolom yang diketahui menggunakan path lengkap alias tabel dan nama kolom.

table_alias

Tidak

Alias tabel kustom.

location_path

Ya

  • Lokasi file Parquet. Harus berupa direktori OSS dengan format oss://oss_endpoint/bucket_name/path/.

  • Tingkat berikutnya di bawah path mendukung direktori partisi dengan format partition_name=partition_value.

  • Schemaless Query tidak mendukung perlakuan subdirektori dalam lokasi sebagai partisi, sehingga Pemangkasan partisi tidak didukung.

key&value

Ya

Parameter dan nilai-nilainya untuk pernyataan kueri. Lihat tabel berikut untuk detailnya.

Tabel parameter key-value

Key

Wajib

Deskripsi

Value

Default

file_format

Ya

Menentukan format file di lokasi tersebut. Hanya Parquet yang didukung. Format lain akan mengembalikan error.

parquet

parquet

rolearn

Tidak

Menentukan RoleARN yang diperlukan untuk mengakses lokasi tersebut.

  • Login ke RAM console.

  • Di bilah navigasi kiri, pilih Identities > Roles.

  • Di bagian Basic Information, Anda dapat memperoleh ARN.

Catatan

Jika Anda tidak menentukan RoleARN dalam pernyataan SQL, sistem secara default menggunakan ARN dari role AliyunODPSDefaultRole.

acs:ram::xxxxxx:role/aliyunodpsdefaultrole

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

file_pattern_blacklist

Tidak

Menentukan daftar file yang harus dikecualikan. File yang namanya sesuai dengan pola tersebut tidak akan dibaca.

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

Tidak ada

file_pattern_whitelist

Tidak

Menentukan daftar file yang harus disertakan. Hanya file yang namanya sesuai dengan pola tersebut yang akan dibaca.

".*_20250124_.*.parquet"

.*

Contoh

Contoh 1: Membaca data OSS menggunakan parameter blacklist dan whitelist

  1. Siapkan data.

    1. Login ke OSS console.

    2. Di panel navigasi kiri, klik Buckets.

    3. Di halaman Buckets, klik Create Bucket.

    4. Buat direktori bucket OSS object-table-test/schema/.

    5. Siapkan file Parquet untuk pembacaan dan validasi whitelist. Jalankan kode Python berikut secara lokal untuk membuat file tersebut.

      import pandas as pd
      # Data contoh
      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. Unggah file Parquet ke direktori bucket OSS object-table-test/schema/.

      1. Login ke OSS console.

      2. Di direktori bucket object-table-test/schema/, klik Upload File.

    7. Siapkan file CSV di direktori bucket OSS object-table-test/schema/ untuk memvalidasi parameter blacklist.

  2. Baca file Parquet.

    Login ke MaxCompute client (odpscmd) dan jalankan perintah SQL berikut.

    • Tambahkan test_oss.csv ke blacklist dan baca file Parquet dari OSS.

      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.*'
      );
    • Tambahkan sample_data ke whitelist dan baca file Parquet dari OSS.

      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.*'
      );

    Dalam kedua kasus tersebut, file sample_data dibaca. Hasil berikut dikembalikan:

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

Contoh 2: Membaca data yang ditulis oleh Spark

  1. Buat direktori bucket OSS object-table-test/spark/.

  2. Hasilkan data Parquet menggunakan Serverless Spark. Untuk informasi selengkapnya, lihat Create an SQL job. Anda dapat melewati langkah ini jika file Parquet yang ditulis oleh Spark sudah ada di direktori OSS.

    1. Login ke E-MapReduce console, lalu pilih region di pojok kiri atas.

    2. Di panel navigasi kiri, pilih EMR Serverless > Spark.

    3. Di halaman Spark, klik nama workspace target untuk masuk ke workspace Spark atau klik Create Workspace, lalu setelah berhasil dibuat, klik untuk masuk ke workspace baru tersebut.

    4. Di panel navigasi kiri, pilih Data Development, buat file SparkSQL baru dan jalankan SQL berikut:

      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. Login ke OSS console dan lihat file data yang dihasilkan di jalur tujuan.

  4. Login ke client MaxCompute, tambahkan _SUCCESS ke blacklist, dan baca file Parquet dari OSS.

    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.*'
    );

    Hasil berikut dikembalikan:

    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+
    | 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}    |
    +----+---------+-----+------------+-----------+---------------------+----------------------------------------------+

Untuk informasi selengkapnya tentang operasi Schemaless Query, lihat Read Parquet data from a data lake using Schemaless Query.

Contoh 3: Menggunakan Schemaless Query dalam subkueri

  1. Siapkan data.

    Login ke OSS console dan unggah file uji part-00001.snappy.parquet ke direktori bucket OSS object-table-test/schema/. Untuk informasi selengkapnya, lihat Upload OSS files.

  2. Login ke client MaxCompute dan buat tabel internal untuk menyimpan data yang secara otomatis ditemukan dari OSS.

    CREATE TABLE ow_test (
        id INT,
        name STRING,
        age INT
    );
  3. Gunakan Schemaless Query untuk membaca data dari OSS.

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

    Hasil berikut dikembalikan:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  4. Gunakan data OSS sebagai subkueri dalam pernyataan SQL luar untuk menanyakan tabel ow_test.

    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;

    Hasil berikut dikembalikan:

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

Contoh 4: Menyimpan hasil Schemaless Query ke tabel gudang data internal

  1. Siapkan data.

    Login ke OSS console dan unggah file uji part-00001.snappy.parquet ke direktori bucket OSS object-table-test/schema/. Untuk informasi selengkapnya, lihat Upload OSS files.

  2. Login ke client MaxCompute dan gunakan Schemaless Query untuk membaca data dari OSS.

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

    Hasil berikut dikembalikan:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. Gunakan pernyataan CREATE TABLE AS untuk menyalin data yang secara otomatis ditemukan dari OSS ke tabel internal, lalu tanyakan tabel tersebut untuk melihat hasilnya.

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

    Hasil berikut dikembalikan:

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

Contoh 5: UNLOAD hasil Kueri Tanpa Skema kembali ke data lake

  1. Siapkan data.

    Login ke OSS console dan unggah file uji part-00001.snappy.parquet ke direktori bucket OSS object-table-test/schema/. Untuk informasi selengkapnya, lihat Upload OSS files.

  2. Login ke client MaxCompute dan gunakan Schemaless Query untuk membaca data dari OSS.

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

    Hasil berikut dikembalikan:

    +------------+------------+------------+
    | id         | name       | age        |
    +------------+------------+------------+
    | 3          | Charlie    | 35         |
    | 4          | David      | 40         |
    | 5          | Eve        | 28         |
    +------------+------------+------------+
  3. Gunakan perintah UNLOAD untuk mengekspor hasil yang secara otomatis ditemukan ke OSS. Untuk informasi selengkapnya tentang operasi UNLOAD, lihat 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;

    Lihat file yang dihasilkan di direktori OSS: Setelah perintah berhasil dieksekusi, file Parquet 20250715070650775g0etr15glr2_M1_1_0_0-0_TableSink1.parquet dihasilkan di path OSS unload/ow_test_3/. Ukuran file adalah 0,449 KB dan kelas penyimpanannya adalah Standard.