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 |
|
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 |
|
|
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.
Catatan
Jika Anda tidak menentukan RoleARN dalam pernyataan SQL, sistem secara default menggunakan ARN dari role |
|
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. |
|
Tidak ada |
|
file_pattern_whitelist |
Tidak |
Menentukan daftar file yang harus disertakan. Hanya file yang namanya sesuai dengan pola tersebut yang akan dibaca. |
|
|
Contoh
Contoh 1: Membaca data OSS menggunakan parameter blacklist dan whitelist
-
Siapkan data.
-
Login ke OSS console.
-
Di panel navigasi kiri, klik Buckets.
-
Di halaman Buckets, klik Create Bucket.
-
Buat direktori bucket OSS
object-table-test/schema/. -
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') -
Unggah file Parquet ke direktori bucket OSS
object-table-test/schema/.-
Login ke OSS console.
-
Di direktori bucket
object-table-test/schema/, klik Upload File.
-
-
Siapkan file CSV di direktori bucket OSS
object-table-test/schema/untuk memvalidasi parameter blacklist.
-
-
Baca file Parquet.
Login ke MaxCompute client (odpscmd) dan jalankan perintah SQL berikut.
-
Tambahkan
test_oss.csvke 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_datake 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_datadibaca. Hasil berikut dikembalikan:+------------+------------+------------+ | id | name | age | +------------+------------+------------+ | 3 | Charlie | 35 | | 4 | David | 40 | | 5 | Eve | 28 | +------------+------------+------------+ -
Contoh 2: Membaca data yang ditulis oleh Spark
-
Buat direktori bucket OSS
object-table-test/spark/. -
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.
-
Login ke E-MapReduce console, lalu pilih region di pojok kiri atas.
-
Di panel navigasi kiri, pilih .
-
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.
-
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;
-
-
Login ke OSS console dan lihat file data yang dihasilkan di jalur tujuan.
-
Login ke client MaxCompute, tambahkan
_SUCCESSke 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
-
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. -
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 ); -
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 | +------------+------------+------------+ -
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
-
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. -
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 | +------------+------------+------------+ -
Gunakan pernyataan
CREATE TABLE ASuntuk 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
-
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. -
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 | +------------+------------+------------+ -
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.parquetdihasilkan di path OSSunload/ow_test_3/. Ukuran file adalah 0,449 KB dan kelas penyimpanannya adalah Standard.