全部产品
Search
文档中心

MaxCompute:Tabel eksternal OSS

更新时间:Jan 21, 2026

MaxCompute memungkinkan Anda membuat tabel eksternal Object Storage Service (OSS) dalam suatu Proyek untuk memetakan ke direktori di OSS. Tabel eksternal OSS dapat digunakan untuk mengakses data tidak terstruktur dari file dalam direktori OSS atau menulis data dari Proyek MaxCompute ke direktori OSS. Topik ini menjelaskan sintaks dan parameter untuk membuat, membaca dari, serta menulis ke tabel eksternal OSS.

Lingkup

  • Tabel eksternal OSS tidak mendukung properti cluster.

  • Ukuran satu file tidak boleh melebihi 2 GB. File yang lebih besar dari 2 GB harus dibagi.

  • MaxCompute dan OSS harus berada di Wilayah yang sama.

Metode akses

Anda dapat menggunakan platform berikut untuk membuat tabel eksternal OSS serta membaca dari atau menulis ke tabel tersebut.

Metode

Platform

MaxCompute SQL

Visualisasi

Prasyarat

  • Anda telah membuat Proyek MaxCompute.

  • Persiapkan bucket dan direktori OSS. Untuk informasi selengkapnya, lihat Buat bucket dan Kelola direktori.

    MaxCompute dapat secara otomatis membuat direktori di OSS. Jika pernyataan SQL mencakup tabel eksternal dan Fungsi yang Ditentukan Pengguna (UDF), Anda dapat menggunakan satu pernyataan SQL untuk membaca dari dan menulis ke tabel eksternal sekaligus menjalankan UDF. Metode lama dengan membuat direktori secara manual juga tetap didukung.

    Karena MaxCompute hanya dideploy di beberapa Wilayah, konektivitas jaringan cross-region bisa menjadi masalah. Simpan bucket Anda di Wilayah yang sama dengan Proyek MaxCompute Anda.
  • Otorisasi

    • Dapatkan izin untuk mengakses OSS. Akun Alibaba Cloud, Pengguna RAM, atau Peran RAM dapat digunakan untuk mengakses tabel eksternal OSS. Untuk informasi otorisasi, lihat Otorisasi STS untuk OSS.

    • Dapatkan izin CreateTable di Proyek MaxCompute Anda. Untuk informasi selengkapnya tentang izin operasi tabel, lihat Izin MaxCompute.

Buat tabel eksternal OSS

  • Tabel partisi dan non-partisi: Tabel eksternal OSS dapat berupa tabel partisi atau non-partisi, tergantung pada struktur path penyimpanan file data di OSS. Jika file data disimpan dalam path berpartisi, buat tabel partisi; jika tidak, buat tabel non-partisi.

  • Nama domain jaringan: Gunakan nama domain jaringan klasik untuk OSS. MaxCompute tidak menjamin konektivitas jaringan untuk nama domain jaringan publik.

  • Tabel eksternal OSS hanya mencatat pemetaan ke direktori OSS. Menghapus tabel eksternal OSS tidak akan menghapus file data di direktori OSS yang dipetakan.

  • Jika file data OSS merupakan objek arsip, Anda harus terlebih dahulu memulihkan objek tersebut.

Pernyataan untuk membuat tabel eksternal OSS memiliki pengaturan parameter yang berbeda tergantung pada format file data. Buat tabel eksternal yang sesuai dengan kebutuhan bisnis Anda berdasarkan sintaks dan deskripsi parameter. Jika tidak, operasi membaca atau menulis data ke OSS akan gagal.

Sintaks

Buat tabel eksternal menggunakan parser data teks bawaan

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>'  
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>';

Format file data yang didukung untuk membaca dari atau menulis ke OSS:

  • CSV

  • TSV

  • File CSV dan TSV yang dikompresi dengan GZIP, SNAPPY, atau LZO

Buat tabel eksternal menggunakan parser data open source bawaan

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)]
[row format serde '<serde_class>'
  [WITH serdeproperties (
    ['<property_name>'='<property_value>',...])
  ]
]
stored AS <file_format> 
location '<oss_location>' 
[USING '<resource_name>']
[tblproperties ('<tbproperty_name>'='<tbproperty_value>',...)];

Format file data yang didukung untuk membaca dari atau menulis ke OSS:

  • PARQUET

  • TEXTFILE

  • ORC

  • RCFILE

  • AVRO

  • JSON

  • SEQUENCEFILE

  • Hudi (hanya mendukung pembacaan data Hudi yang dihasilkan oleh DLF)

  • File PARQUET yang dikompresi dengan ZSTD, SNAPPY, atau GZIP

  • File ORC yang dikompresi dengan SNAPPY atau ZLIB

  • File TEXTFILE yang dikompresi dengan GZIP, SNAPPY, atau LZO

Buat tabel eksternal menggunakan parser kustom

Sintaks

Format file data

Contoh

CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name> 
(
<col_name> <date_type>,
...
)
[comment <table_comment>]
[partitioned BY (<col_name> <data_type>, ...)] 
stored BY '<StorageHandler>' 
WITH serdeproperties (
 ['<property_name>'='<property_value>',...]
) 
location '<oss_location>' 
USING '<jar_name>';

Format file data yang didukung untuk membaca dari atau menulis ke OSS: File data dalam format selain yang tercantum di atas.

Parameter

Berikut adalah parameter umum untuk tabel eksternal berbagai format. Untuk parameter unik, lihat dokumentasi masing-masing format tabel eksternal spesifik.

  • Parameter sintaks dasar

    Parameter

    Wajib

    Deskripsi

    mc_oss_extable_name

    Ya

    Nama tabel eksternal OSS yang akan dibuat.

    Nama tabel tidak peka huruf besar/kecil. Anda tidak perlu membedakan antara huruf besar dan kecil saat mengkueri tabel eksternal, dan Anda tidak dapat memaksa konversi huruf besar/kecil.

    col_name

    Ya

    Nama kolom dalam tabel eksternal OSS.

    Saat membaca data dari OSS, skema tabel eksternal OSS yang dibuat harus sama dengan skema file data OSS. Jika tidak, data tidak dapat dibaca.

    data_type

    Ya

    Tipe data kolom dalam tabel eksternal OSS.

    Saat membaca data dari OSS, tipe data setiap kolom dalam tabel eksternal OSS harus sama dengan tipe data kolom yang sesuai dalam file data OSS. Jika tidak, data tidak dapat dibaca.

    table_comment

    Tidak

    Komentar untuk tabel. Komentar harus berupa string valid dengan panjang maksimal 1.024 byte. Jika tidak, kesalahan akan dilaporkan.

    partitioned by (col_name data_type, ...)

    Tidak

    Jika file data di OSS disimpan dalam path berpartisi, sertakan parameter ini untuk membuat tabel partisi.

    • col_name: Nama kolom kunci partisi.

    • data_type: Tipe data kolom kunci partisi.

    '<(tb)property_name>'='<(tb)property_value>'

    Ya

    Properti tambahan tabel eksternal OSS. Untuk informasi selengkapnya tentang parameter, lihat dokumentasi parameter unik masing-masing format.

    oss_location

    Ya

    Path OSS tempat file data berada. Secara default, semua file data dalam path ini akan dibaca.

    Formatnya adalah oss://<oss_endpoint>/<Nama bucket>/<Nama direktori OSS>/.

    • oss_endpoint:

      • Nama domain OSS. Anda harus menggunakan titik akhir jaringan klasik yang disediakan oleh OSS, yang mengandung -internal.

        Contoh: oss://oss-cn-beijing-internal.aliyuncs.com/xxx.

        Untuk informasi selengkapnya tentang nama domain jaringan klasik OSS, lihat Wilayah dan titik akhir.

        Pastikan Wilayah OSS tempat file data disimpan sama dengan Wilayah Proyek MaxCompute Anda. Jika berbeda, masalah konektivitas jaringan dapat terjadi.
      • Jika Anda tidak menentukan titik akhir, sistem akan menggunakan titik akhir Wilayah tempat proyek saat ini berada.

        Metode ini tidak disarankan karena penyimpanan file cross-region dapat menyebabkan masalah konektivitas jaringan.
    • Nama bucket: Nama bucket OSS. Nama bucket harus mengikuti oss_endpoint.

      Contoh: oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/.

      Untuk informasi selengkapnya tentang cara melihat nama bucket, lihat Daftar bucket.

    • Nama direktori: Nama direktori OSS. Jangan tentukan nama file setelah direktori.

      Contoh: oss://oss-cn-beijing-internal.aliyuncs.com/oss-mc-test/Demo1/.

      Contoh yang salah:

       -- Koneksi HTTP tidak didukung.
      http://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/
      -- Koneksi HTTPS tidak didukung.               
      https://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/
      -- Alamat koneksi salah.            
      oss://oss-cn-shanghai-internal.aliyuncs.com/Demo1
      -- Jangan tentukan nama file.                            
      oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/vehicle.csv
    • Spesifikasi izin (RamRole):

      • Tentukan secara eksplisit (Disarankan): Buat role kustom, lampirkan kebijakan akses, dan gunakan ARN role kustom tersebut. Untuk informasi selengkapnya, lihat Otorisasi STS.

      • Gunakan Default (Tidak disarankan): Gunakan ARN role aliyunodpsdefaultrole.

  • Dengan atribut serdeproperties

    property_name

    Skenario

    property_value

    Nilai default

    odps.properties.rolearn

    Tambahkan properti ini saat menggunakan otorisasi STS.

    Tentukan ARN Peran RAM yang memiliki izin untuk mengakses OSS.

    Dapatkan ARN dari detail role di Konsol RAM. Contoh: acs:ram::xxxxxx:role/aliyunodpsdefaultrole.

    • Jika pemilik MaxCompute dan OSS adalah akun yang sama:

      • Jika Anda tidak menentukan odps.properties.rolearn dalam pernyataan pembuatan tabel, ARN role aliyunodpsdefaultrole akan digunakan secara default. Anda harus terlebih dahulu membuat role aliyunodpsdefaultrole menggunakan Otorisasi STS.

      • Untuk menggunakan ARN role kustom, Anda harus terlebih dahulu membuat role kustom tersebut. Untuk informasi selengkapnya, lihat Otorisasi STS untuk OSS (otorisasi kustom).

    • Jika pemilik MaxCompute dan OSS adalah akun yang berbeda, Anda harus menentukan ARN role kustom. Untuk informasi selengkapnya, lihat Otorisasi STS untuk OSS (otorisasi kustom).

Mengisi partisi untuk tabel eksternal OSS

Jika Anda membuat tabel eksternal OSS berpartisi, Anda harus melakukan operasi tambahan untuk mengimpor data partisi.

  • Metode 1 (Disarankan): Secara otomatis mengurai struktur direktori OSS untuk mengidentifikasi dan menambahkan partisi ke tabel eksternal OSS.

    Metode ini cocok untuk skenario di mana Anda perlu menambahkan semua partisi historis yang hilang sekaligus. MaxCompute secara otomatis mengisi partisi tabel eksternal OSS berdasarkan direktori partisi yang Anda tentukan saat membuat tabel. Anda tidak perlu menambahkannya satu per satu berdasarkan nama dan nilai kolom partisi.

    MSCK REPAIR TABLE <mc_oss_extable_name> ADD PARTITIONS [ WITH properties (key:VALUE, key: VALUE ...)];
    Metode ini tidak cocok untuk menambahkan data inkremental, terutama ketika direktori OSS berisi banyak partisi, misalnya lebih dari 1.000. Jika jumlah partisi baru jauh lebih sedikit daripada jumlah partisi yang ada, menjalankan perintah msck secara berulang menyebabkan banyak pemindaian berulang direktori OSS dan pembaruan metadata, sehingga mengurangi efisiensi eksekusi perintah. Untuk skenario yang memerlukan pembaruan partisi inkremental, gunakan Metode 2.
  • Metode 2: Jalankan perintah secara manual untuk menambahkan informasi partisi ke tabel eksternal OSS.

    Metode ini cocok untuk skenario di mana partisi historis telah dibuat dan Anda perlu menambahkan partisi baru secara berkala dan sering. Anda harus membuat partisi sebelum tugas penulisan data dieksekusi. Bahkan jika data baru ditulis ke OSS, Anda tidak perlu merefresh partisi yang sesuai. Tabel eksternal dapat membaca data terbaru dari direktori OSS.

    ALTER TABLE <mc_oss_extable_name> 
      ADD PARTITION (<col_name>=<col_value>)[
      ADD PARTITION (<col_name>=<col_value>)...][location URL];

    Nilai col_name dan col_value harus sesuai dengan nama direktori tempat file data partisi berada.

    Asumsikan struktur direktori OSS untuk file data partisi seperti yang ditunjukkan pada gambar berikut. col_name sesuai dengan direction, dan col_value sesuai dengan N, NE, S, SW, W. Satu klausa add partition sesuai dengan satu subdirektori. Untuk beberapa subdirektori OSS, Anda harus menggunakan beberapa klausa add partition.

    分区路径

Baca data dari OSS

Catatan

  • Setelah membuat tabel eksternal OSS, Anda dapat membaca data dari OSS melalui tabel eksternal tersebut. Untuk informasi tentang jenis file data OSS yang didukung dan sintaks pembuatan tabel eksternal OSS, lihat Sintaks.

  • Jika pernyataan SQL melibatkan tipe data kompleks, tambahkan perintah set odps.sql.type.system.odps2=true; sebelum pernyataan SQL dan kirimkan bersama-sama. Untuk informasi selengkapnya tentang tipe data, lihat Versi tipe data.

  • Untuk tabel eksternal OSS yang memetakan ke data open source, atur set odps.sql.hive.compatible=true; pada tingkat session sebelum membaca data dari OSS. Jika tidak, kesalahan akan dilaporkan.

  • OSS menyediakan sumber daya bandwidth terbatas. Jika trafik baca/tulis data melebihi batas bandwidth instans dalam periode singkat, kecepatan baca/tulis data tabel eksternal OSS akan langsung terpengaruh. Untuk informasi selengkapnya tentang bandwidth OSS, lihat Batasan dan metrik performa.

Sintaks

<select_statement> FROM <from_statement>;
  • select_statement: Klausul SELECT, yang mengkueri data yang akan dimasukkan ke tabel target dari tabel sumber.

  • from_statement: Klausul FROM, yang menentukan sumber data, seperti nama tabel eksternal.

Data non-partisi

Setelah membuat tabel eksternal OSS non-partisi, Anda dapat membaca data dari OSS dengan cara berikut:

  • Metode 1 (Disarankan): Impor data format open source dari OSS ke tabel internal MaxCompute, lalu baca datanya.

    Metode ini cocok untuk skenario yang memerlukan perhitungan berulang atau memiliki persyaratan tinggi terhadap performa komputasi. Dengan membuat tabel internal di Proyek MaxCompute yang memiliki skema sama dengan tabel eksternal OSS, Anda dapat mengimpor data OSS ke tabel internal ini lalu menjalankan kueri kompleks. Pendekatan ini memanfaatkan sepenuhnya mekanisme optimasi MaxCompute untuk penyimpanan internal guna meningkatkan performa komputasi. Berikut adalah contoh perintah:

    CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>;
    INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;
  • Metode 2: Baca data langsung dari OSS, mirip dengan operasi pada tabel internal MaxCompute.

    Metode ini cocok untuk skenario dengan persyaratan rendah terhadap performa komputasi. Berbeda dengan membaca dari tabel internal, setiap operasi baca data langsung mengambil data yang sesuai dari OSS.

Data berpartisi

Setelah tabel eksternal OSS dibuat, MaxCompute melakukan pemindaian penuh terhadap semua data di direktori OSS, termasuk file data di subdirektori. Jika volume data besar, pemindaian direktori penuh dapat menyebabkan konsumsi I/O yang tidak perlu dan meningkatkan waktu pemrosesan data. Anda dapat mengatasi masalah ini dengan dua cara.

  • Metode 1 (Disarankan): Simpan data di OSS menggunakan path partisi standar atau path partisi kustom.

    Saat membuat tabel eksternal OSS, Anda harus menentukan informasi partisi dan oss_location dalam pernyataan pembuatan tabel. Kami menyarankan Anda menyimpan data OSS menggunakan path partisi standar.

  • Metode 2: Rencanakan beberapa path penyimpanan data.

    Anda dapat membuat beberapa tabel eksternal OSS untuk membaca data dari setiap path. Artinya, setiap tabel eksternal OSS mengarah ke subset data OSS. Metode ini rumit dan tidak efektif untuk manajemen data, sehingga kami tidak merekomendasikannya.

Format path partisi standar

oss://<oss_endpoint>/<Nama bucket>/<nama direktori>/<partitionKey1=value1>/<partitionKey2=value2>/...

Contoh: Perusahaan menyimpan file log harian dalam format CSV di OSS dan memproses data tersebut setiap hari menggunakan MaxCompute. Path partisi standar untuk menyimpan data OSS harus diatur sebagai berikut.

oss://oss-odps-test/log_data/year=2016/month=06/day=01/logfile
oss://oss-odps-test/log_data/year=2016/month=06/day=02/logfile
oss://oss-odps-test/log_data/year=2016/month=07/day=10/logfile
oss://oss-odps-test/log_data/year=2016/month=08/day=08/logfile
...

Format path partisi kustom

Format path partisi kustom hanya berisi nilai kolom partisi, bukan nama kolom partisi. Contoh:

oss://oss-odps-test/log_data_customized/2016/06/01/logfile
oss://oss-odps-test/log_data_customized/2016/06/02/logfile
oss://oss-odps-test/log_data_customized/2016/07/10/logfile
oss://oss-odps-test/log_data_customized/2016/08/08/logfile
...

Jika data di OSS disimpan secara berpartisi tetapi path-nya tidak dalam format path partisi standar, MaxCompute memungkinkan Anda mengikat subdirektori berbeda ke partisi berbeda untuk mengakses data subdirektori tersebut.

Solusi: Setelah membuat tabel eksternal OSS, gunakan perintah alter table ... add partition ... location ... untuk menentukan subdirektori dan mengikat subdirektori berbeda ke partisi berbeda. Berikut adalah contoh perintah.

ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/01/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/02/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/07/10/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/08/08/';

Optimasi kueri

  • Pengumpulan statistik dinamis

    Karena data disimpan di data lake eksternal dan tidak memiliki statistik yang telah ada sebelumnya, pengoptimal kueri menggunakan strategi konservatif, yang mengakibatkan efisiensi kueri rendah. Fitur pengumpulan statistik dinamis memungkinkan pengoptimal untuk sementara mengumpulkan statistik tabel selama eksekusi kueri guna mengidentifikasi tabel kecil. Fitur ini kemudian secara aktif menggunakan metode seperti Hash Join, mengoptimalkan urutan join, mengurangi shuffles, dan memperpendek pipeline eksekusi untuk mencapai optimasi kueri.

    Parameter berikut tidak berlaku untuk tabel eksternal Paimon, Hudi, atau Delta Lake.

    SET odps.meta.exttable.stats.onlinecollect=true;
    SELECT * FROM <tablename>;
  • Mengoptimalkan pemisahan tabel eksternal

    Anda dapat mengoptimalkan efisiensi kueri dengan mengatur parameter ukuran split untuk menyesuaikan jumlah data yang diproses oleh satu tugas konkuren. Pengaturan ukuran split memiliki efek berikut.

    • Jika volume data tabel sangat besar dan jumlah data yang dibaca setiap kali terlalu kecil, jumlah split terlalu tinggi, yang menyebabkan paralelisme berlebihan. Instans kemudian menghabiskan sebagian besar waktunya menunggu sumber daya.

    • Jika volume data tabel sangat kecil dan jumlah data yang dibaca setiap kali terlalu besar, jumlah split terlalu rendah, yang mengakibatkan konkurensi tidak mencukupi. Sebagian besar sumber daya kemudian menganggur.

    -- Anda dapat menggunakan salah satu parameter berikut.
    
    -- Satuan: MiB. Nilai default: 256 MiB. Berlaku untuk tabel internal atau eksternal.
    SET odps.stage.mapper.split.size=<value>;
    SELECT * FROM <tablename>;
    
    -- Satuan: MiB. Nilai default: 256 MiB. Hanya berlaku untuk tabel eksternal.
    SET odps.sql.unstructured.data.split.size=<value>;
    SELECT * FROM <tablename>;

Tulis data ke OSS

Seperti halnya membaca data dari OSS, MaxCompute memungkinkan Anda menulis data dari tabel internal atau data yang diproses dari tabel eksternal ke OSS. Untuk informasi selengkapnya tentang batasan, lihat Lingkup.

Sintaks

INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...]) 
<select_statement> FROM <from_statement>;

Parameter

Wajib

Deskripsi

table_name

Ya

Nama tabel eksternal yang akan ditulis.

select_statement

Ya

Klausul SELECT, yang mengkueri data yang akan dimasukkan ke tabel target dari tabel sumber. Jika tabel target hanya memiliki satu level partisi dinamis, nilai field terakhir dalam klausul SELECT adalah nilai partisi dinamis tabel target. Hubungan antara nilai dari SELECT tabel sumber dan nilai partisi output ditentukan oleh urutan field, bukan oleh nama kolom. Jika urutan field tabel sumber berbeda dengan tabel target, tentukan field dalam select_statement sesuai urutan tabel target.

from_statement

Ya

Klausul FROM, yang menunjukkan sumber data. Misalnya, nama tabel internal yang akan dibaca.

Untuk memasukkan data ke partisi dinamis, lihat Masukkan atau timpa data ke partisi dinamis (DYNAMIC PARTITION).

Catatan

  • Jika operasi INSERT OVERWRITE ... SELECT ... FROM ...; mengalokasikan 1.000 mapper pada tabel sumber from_tablename, maka 1.000 file TSV atau CSV akan dihasilkan.

  • Anda dapat mengontrol jumlah file yang dihasilkan menggunakan konfigurasi yang disediakan oleh MaxCompute.

    • Jika outputter berada di mapper: Gunakan odps.stage.mapper.split.size untuk mengontrol jumlah mapper konkuren, yang menyesuaikan jumlah file yang dihasilkan.

    • Jika outputter berada di reducer atau joiner: Gunakan odps.stage.reducer.num dan odps.stage.joiner.num masing-masing untuk menyesuaikan jumlah file yang dihasilkan.

  • Risiko penulisan tidak konsisten: Saat Anda menggunakan pernyataan `INSERT OVERWRITE` pada tabel eksternal OSS atau menggunakan perintah `UNLOAD` untuk mengekspor file ke OSS, data di subdirektori lokasi OSS yang ditentukan atau lokasi yang sesuai dengan partisi akan dihapus sebelum data baru ditulis. Jika direktori lokasi berisi data penting yang ditulis langsung ke OSS oleh mesin eksternal lain, data tersebut juga akan dihapus sebelum data baru ditulis. Oleh karena itu, Anda harus memastikan bahwa file yang ada di direktori lokasi tabel eksternal telah dibackup atau direktori `UNLOAD` kosong. Untuk risiko lain penulisan tidak konsisten, lihat Lingkup.

Tulis data ke OSS menggunakan fitur unggah multi-bagian OSS

Saat Anda perlu menulis data ke OSS dalam format open source, Anda dapat menggunakan tabel eksternal OSS yang dibuat dengan parser data open source dan fitur unggah multi-bagian OSS untuk melakukan operasi INSERT guna menulis data ke OSS.

Untuk mengaktifkan fitur unggah multi-bagian OSS, atur sebagai berikut:

Skenario

Perintah

Atur pada tingkat proyek

Berlaku untuk seluruh proyek.

setproject odps.sql.unstructured.oss.commit.mode =true;

Atur pada tingkat session

Berlaku hanya untuk tugas saat ini.

set odps.sql.unstructured.oss.commit.mode =true;

Nilai default properti odps.sql.unstructured.oss.commit.mode adalah false. Prinsip implementasi untuk nilai berbeda adalah sebagai berikut:

Nilai

Prinsip

false

Data yang ditulis oleh MaxCompute ke tabel eksternal OSS disimpan di folder .odps di bawah direktori LOCATION. Folder .odps berisi file .meta untuk memastikan konsistensi data untuk MaxCompute. Konten .odps hanya dapat diproses dengan benar oleh MaxCompute. Mesin pemrosesan data lain mungkin tidak dapat menguraikannya dengan benar, yang dapat menyebabkan kesalahan.

true

MaxCompute menggunakan fitur unggah multi-bagian agar kompatibel dengan mesin pemrosesan data lain. Fitur ini menggunakan metode two-phase commit untuk memastikan konsistensi data, dan tidak akan ada direktori .odps atau file .meta.

Kelola file yang diekspor

Parameter

Saat Anda perlu menambahkan awalan, akhiran, atau ekstensi ke file data yang ditulis ke OSS, Anda dapat menggunakan parameter berikut.

property_name

Skenario

Deskripsi

property_value

Nilai default

odps.external.data.output.prefix

(Kompatibel dengan odps.external.data.prefix)

Tambahkan properti ini saat Anda perlu menambahkan awalan kustom ke file output.

  • Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _).

  • Panjang antara 1 hingga 10 karakter.

Kombinasi karakter yang diizinkan, seperti 'mc_'

Tidak ada

odps.external.data.enable.extension

Tambahkan properti ini saat Anda perlu menampilkan ekstensi file output.

True menunjukkan bahwa ekstensi file output ditampilkan. False menunjukkan bahwa ekstensi tidak ditampilkan.

  • True

  • False

False

odps.external.data.output.suffix

Tambahkan properti ini saat Anda perlu menambahkan akhiran kustom ke file output.

Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _).

Kombinasi karakter yang diizinkan, seperti '_hangzhou'

Tidak ada

odps.external.data.output.explicit.extension

Tambahkan properti ini saat Anda perlu menambahkan ekstensi kustom ke file output.

  • Hanya berisi angka, huruf, dan garis bawah (a-z, A-Z, 0-9, _).

  • Panjang antara 1 hingga 10 karakter.

  • Memiliki prioritas lebih tinggi daripada parameter odps.external.data.enable.extension.

Kombinasi karakter yang diizinkan, seperti "jsonl"

Tidak ada

Contoh

  1. Atur awalan kustom file OSS output menjadi test06_. Pernyataan DDL-nya adalah sebagai berikut:

    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 (
    -- Atur awalan kustom.
        'odps.external.data.output.prefix'='test06_') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO  <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image

  2. Atur akhiran kustom file OSS output menjadi _beijing. Pernyataan DDL-nya adalah sebagai berikut:

    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 (
    -- Atur akhiran kustom.
        'odps.external.data.output.suffix'='_beijing') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image

  3. Ekstensi dihasilkan secara otomatis untuk file OSS output. Pernyataan DDL-nya adalah sebagai berikut:

    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 (
    -- Hasilkan ekstensi secara otomatis.
        'odps.external.data.enable.extension'='true') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan:

  4. Atur ekstensi kustom file OSS output menjadi jsonl. Pernyataan DDL-nya adalah sebagai berikut:

    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 (
    -- Atur ekstensi kustom.
       'odps.external.data.output.explicit.extension'='jsonl') 
    ;
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image.png

  5. Atur awalan file OSS output menjadi mc_, akhiran menjadi _beijing, dan ekstensi menjadi jsonl. Pernyataan DDL-nya adalah sebagai berikut:

    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 (
        -- Atur awalan kustom.
        'odps.external.data.output.prefix'='mc_', 
        -- Atur akhiran kustom.
        'odps.external.data.output.suffix'='_beijing', 
        -- Atur ekstensi kustom.
        'odps.external.data.output.explicit.extension'='jsonl') 
    ;  
    
    -- Tulis data ke tabel eksternal.
    INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');

    Gambar berikut menunjukkan file yang dihasilkan.

    image.png

Tulis file besar menggunakan partisi dinamis

Skenario bisnis

Anda dapat mengekspor hasil perhitungan tabel leluhur ke OSS dalam bentuk partisi dan menuliskannya sebagai file besar (misalnya, 4 GB). Anda dapat mencapai ini dengan mengonfigurasi parameter odps.adaptive.shuffle.desired.partition.size (dalam MB) dalam format partisi dinamis.

  • Keuntungan: Anda dapat mengontrol ukuran file output yang diinginkan dengan mengonfigurasi nilai parameter.

  • Kerugian: Waktu eksekusi keseluruhan lebih lama karena menulis file besar mengurangi tingkat paralelisme, yang pada gilirannya meningkatkan waktu eksekusi.

Deskripsi metrik

-- service.mode harus dimatikan.
SET odps.service.mode=off;

-- Kemampuan partisi dinamis harus diaktifkan.
SET odps.sql.reshuffle.dynamicpt=true; 	

-- Atur konsumsi data yang diinginkan untuk setiap reducer. Asumsikan Anda ingin setiap file berukuran 4 GB.
SET odps.adaptive.shuffle.desired.partition.size=4096;	

Contoh

Tulis file JSON sekitar 4 GB ke OSS.

  1. Persiapkan data uji. Gunakan tabel dataset publik bigdata_public_dataset.tpcds_1t.web_sales, yang berukuran sekitar 30 GB. Data disimpan dalam format terkompresi di MaxCompute, sehingga ukurannya bertambah setelah diekspor.

  2. Buat tabel eksternal JSON.

    -- Nama tabel contoh: json_ext_web_sales
    CREATE EXTERNAL TABLE  json_ext_web_sales(
        c_int INT ,
        c_string STRING 
    )
    PARTITIONED BY (pt 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/oss-mc-test/demo-test/';
  3. Tanpa mengatur parameter apa pun, tulis tabel uji ke tabel eksternal JSON dalam format partisi dinamis.

    -- service.mode harus dimatikan.
    set odps.service.mode=off;
    
    -- Aktifkan switch sintaks Layer 3.
    SET odps.namespace.schema=true;
    
    -- Tulis ke tabel eksternal JSON dalam format partisi dinamis.
    INSERT OVERWRITE json_ext_web_sales 
    PARTITION(pt) 
    SELECT CAST(ws_item_sk AS INT) AS c_int, 
           CAST(ws_bill_customer_sk AS string) AS c_string , 
          COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt 
    FROM  bigdata_public_dataset.tpcds_1t.web_sales;

    File yang disimpan di OSS ditunjukkan pada gambar berikut:

    image

  4. Tambahkan parameter odps.adaptive.shuffle.desired.partition.size untuk output file besar dan tulis tabel uji ke tabel eksternal JSON dalam format partisi dinamis.

    -- service.mode harus dimatikan.
    SET odps.service.mode=off;
    
    -- Aktifkan switch sintaks Layer 3.
    SET odps.namespace.schema=true;
    
    -- Kemampuan partisi dinamis harus diaktifkan.
    SET odps.sql.reshuffle.dynamicpt=true; 	
    
    -- Atur konsumsi data yang diinginkan untuk setiap reducer. Asumsikan Anda ingin setiap file berukuran 4 GB.
    SET odps.adaptive.shuffle.desired.partition.size=4096;	
    
    -- Tulis ke tabel eksternal JSON dalam format partisi dinamis.
    INSERT OVERWRITE json_ext_web_sales 
    PARTITION(pt) 
    SELECT CAST(ws_item_sk AS INT) AS c_int, 
           CAST(ws_bill_customer_sk AS string) AS c_string , 
          COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt 
    FROM  bigdata_public_dataset.tpcds_1t.web_sales;

    File yang disimpan di OSS ditunjukkan pada gambar berikut:

    image

Impor dari atau ekspor ke OSS

  • Perintah LOAD: Mengimpor data dari penyimpanan eksternal, seperti OSS, ke tabel atau partisi MaxCompute.

  • Perintah UNLOAD: Mengekspor data dari Proyek MaxCompute ke penyimpanan eksternal, seperti OSS, untuk digunakan oleh mesin komputasi lain.

Lampiran: Persiapkan data sampel

  1. Persiapkan direktori OSS

    Informasi data sampel yang disediakan adalah sebagai berikut:

    • oss_endpoint: oss-cn-hangzhou-internal.aliyuncs.com, yaitu China (Hangzhou).

    • Nama bucket: oss-mc-test.

    • Nama direktori: Demo1/, Demo2/, Demo3/, dan SampleData/.

  2. Data tabel non-partisi

    File yang diunggah ke direktori Demo1/ adalah vehicle.csv, yang berisi data berikut. Direktori Demo1/ digunakan untuk memetakan ke tabel non-partisi yang dibuat dengan parser data teks bawaan.

    1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S
    1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE
    1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE
    1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W
    1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S
    1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N
    1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW
    1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE
    1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,N
  3. Data tabel partisi

    Direktori Demo2/ berisi lima subdirektori: direction=N/, direction=NE/, direction=S/, direction=SW/, dan direction=W/. File yang diunggah masing-masing adalah vehicle1.csv, vehicle2.csv, vehicle3.csv, vehicle4.csv, dan vehicle5.csv. File-file tersebut berisi data berikut. Direktori Demo2/ digunakan untuk memetakan ke tabel partisi yang dibuat dengan parser data teks bawaan.

    --vehicle1.csv
    1,7,53,1,46.81006,-92.08174,9/15/2014 0:00
    1,10,31,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle2.csv
    1,2,13,1,46.81006,-92.08174,9/14/2014 0:00
    1,3,48,1,46.81006,-92.08174,9/14/2014 0:00
    1,9,4,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle3.csv
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
    1,5,47,1,46.81006,-92.08174,9/14/2014 0:00
    1,6,9,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle4.csv
    1,8,63,1,46.81006,-92.08174,9/15/2014 0:00
    
    --vehicle5.csv
    1,4,30,1,46.81006,-92.08174,9/14/2014 0:00
  4. Data terkompresi

    File yang diunggah ke direktori Demo3/ adalah vehicle.csv.gz. File di dalam paket terkompresi adalah vehicle.csv, yang memiliki konten sama dengan file di direktori Demo1/. File ini digunakan untuk memetakan ke tabel eksternal OSS dengan properti kompresi.

  5. Data parser kustom

    File yang diunggah ke direktori SampleData/ adalah vehicle6.csv, yang berisi data berikut. Direktori SampleData/ digunakan untuk memetakan ke tabel eksternal OSS yang dibuat dengan parser data open source.

    1|1|51|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|2|13|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|3|48|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|4|30|1|46.81006|-92.08174|9/14/2014 0:00|W
    1|5|47|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|6|9|1|46.81006|-92.08174|9/14/2014 0:00|S
    1|7|53|1|46.81006|-92.08174|9/14/2014 0:00|N
    1|8|63|1|46.81006|-92.08174|9/14/2014 0:00|SW
    1|9|4|1|46.81006|-92.08174|9/14/2014 0:00|NE
    1|10|31|1|46.81006|-92.08174|9/14/2014 0:00|N

FAQ

Bagaimana cara mengatasi kesalahan "Inline data exceeds the maximum allowed size" saat memproses data OSS menggunakan tabel eksternal?

  • Masalah

    Saat memproses data OSS, kesalahan Inline data exceeds the maximum allowed size dilaporkan.

  • Penyebab

    OSS Store memiliki batas ukuran untuk setiap file kecil. Kesalahan dilaporkan jika file melebihi 3 GB.

  • Solusi

    Untuk mengatasi masalah ini, Anda dapat menyesuaikan dua properti berikut. Prinsipnya adalah menyesuaikan rencana eksekusi dengan mengubah nilai properti untuk mengontrol ukuran data yang ditulis oleh setiap reducer ke tabel eksternal OSS. Hal ini memastikan bahwa file OSS Store tidak melebihi batas 3 GB.

    set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data yang dibaca setiap mapper, dalam MB.
    set odps.stage.reducer.num=100; # Menyesuaikan jumlah worker di tahap reduce.

Bagaimana cara mengatasi kesalahan overflow memori yang terjadi setelah saya mengunggah UDF untuk mengakses tabel eksternal OSS di MaxCompute, meskipun UDF tersebut lolos pengujian lokal?

  • Masalah

    Saat mengakses tabel eksternal OSS di MaxCompute, UDF yang lolos pengujian lokal mengembalikan kesalahan berikut setelah diunggah.

    FAILED: ODPS-0123131:User defined function exception - Traceback:
    java.lang.OutOfMemoryError: Java heap space        

    Setelah mengatur parameter berikut, waktu eksekusi meningkat, tetapi kesalahan tetap terjadi.

    set odps.stage.mapper.mem = 2048; 
    set odps.stage.mapper.jvm.mem = 4096;       
  • Penyebab

    Terlalu banyak file objek di tabel eksternal, yang menyebabkan penggunaan memori berlebihan, dan tidak ada partisi yang ditetapkan.

  • Solusi

    • Gunakan jumlah data yang lebih kecil untuk kueri.

    • Buat partisi untuk file objek guna mengurangi penggunaan memori.

Bagaimana cara menggabungkan beberapa file kecil menjadi satu file menggunakan tabel eksternal OSS?

Periksa log Logview untuk melihat apakah tahap terakhir dalam rencana eksekusi SQL adalah reducer atau joiner.

  • Jika reducer, jalankan pernyataan set odps.stage.reducer.num=1;

  • Jika joiner, jalankan pernyataan set odps.stage.joiner.num=1;

Bagaimana cara mengatasi kesalahan "Couldn't connect to server" saat membaca dari tabel eksternal OSS?

  • Masalah

    Saat membaca data dari tabel eksternal OSS, kesalahan ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server dilaporkan.

  • Penyebab

    • Penyebab 1: Saat tabel eksternal OSS dibuat, titik akhir publik digunakan untuk oss_endpoint di alamat oss_location, bukan titik akhir internal.

    • Penyebab 2: Saat tabel eksternal OSS dibuat, titik akhir wilayah lain digunakan untuk oss_endpoint di alamat oss_location.

  • Solusi

    • Untuk Penyebab 1:

      Periksa apakah oss_endpoint dalam parameter oss_location pernyataan pembuatan tabel eksternal OSS adalah titik akhir internal. Jika merupakan titik akhir publik, ubah menjadi titik akhir internal. Untuk informasi selengkapnya tentang parameter, lihat Parameter.

      Sebagai contoh, jika pengguna di wilayah Indonesia (Jakarta) menggunakan alamat oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/.... untuk membuat tabel eksternal, alamat tersebut harus diubah menjadi alamat internal yang sesuai oss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/.....

    • Untuk Penyebab 2:

      Periksa apakah oss_endpoint dalam parameter oss_location pernyataan pembuatan tabel eksternal OSS adalah titik akhir wilayah yang ingin Anda akses. Untuk informasi selengkapnya tentang nama domain jaringan klasik OSS, lihat Wilayah dan titik akhir.

Bagaimana cara mengatasi kesalahan "Network is unreachable (connect failed)" saat membuat tabel eksternal OSS?

  • Masalah

    Saat membuat tabel eksternal OSS, kesalahan ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed) dilaporkan.

  • Penyebab

    Saat tabel eksternal OSS dibuat, titik akhir publik digunakan untuk oss_endpoint di alamat oss_location, bukan titik akhir internal.

  • Solusi

    Periksa apakah oss_endpoint dalam parameter oss_location pernyataan pembuatan tabel eksternal OSS adalah titik akhir internal. Jika merupakan titik akhir publik, ubah menjadi titik akhir internal. Untuk informasi selengkapnya tentang parameter, lihat Parameter.

    Sebagai contoh, jika pengguna di wilayah China (Beijing) menggunakan alamat oss://oss-cn-beijing.aliyuncs.com/<bucket>/.... untuk membuat tabel eksternal, alamat tersebut harus diubah menjadi alamat internal yang sesuai oss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/.....

Bagaimana cara mengatasi eksekusi job SQL yang lambat pada tabel eksternal OSS?

  • Pembacaan lambat file terkompresi GZ di tabel eksternal OSS

    • Gejala

      Pengguna membuat tabel eksternal OSS dengan sumber data berupa file terkompresi GZ 200 GB di OSS. Proses pembacaan data lambat.

    • Penyebab

      Kecepatan pemrosesan SQL lambat karena terlalu sedikit mapper yang mengeksekusi komputasi di tahap map.

    • Solusi

      • Untuk data terstruktur, Anda dapat mengatur parameter berikut untuk menyesuaikan jumlah data yang dibaca satu mapper guna mempercepat eksekusi SQL.

        set odps.sql.mapper.split.size=256; # Menyesuaikan ukuran data tabel yang dibaca setiap mapper, dalam MB.       
      • Untuk data tidak terstruktur, periksa apakah hanya ada satu file OSS di path tabel eksternal OSS. Jika hanya ada satu, hanya satu mapper yang dapat dihasilkan karena data tidak terstruktur dalam format terkompresi tidak dapat dibagi. Hal ini mengakibatkan kecepatan pemrosesan lambat. Kami menyarankan Anda membagi file OSS besar menjadi file-file kecil di path tabel eksternal yang sesuai di OSS. Hal ini meningkatkan jumlah mapper yang dihasilkan saat membaca tabel eksternal dan meningkatkan kecepatan pembacaan.

  • Pencarian lambat data tabel eksternal MaxCompute menggunakan SDK

    • Gejala

      Mencari data tabel eksternal MaxCompute menggunakan SDK lambat.

    • Solusi

      Tabel eksternal hanya mendukung pemindaian tabel penuh, yang lambat. Kami menyarankan menggunakan tabel internal MaxCompute sebagai gantinya.

Bagaimana cara mengatasi masalah di mana data lama dihapus tetapi data baru tidak ditulis saat menggunakan fitur unggah multi-bagian OSS?

  • Masalah

    Dalam skenario insert overwrite, jika job gagal dalam kasus ekstrem, hasilnya mungkin tidak sesuai ekspektasi. Data lama dihapus, tetapi data baru tidak ditulis.

  • Penyebab

    Data yang baru ditulis gagal ditulis ke tabel target karena kemungkinan sangat kecil terjadi kegagalan perangkat keras atau kegagalan pembaruan metadata. Operasi penghapusan di OSS tidak mendukung rollback, sehingga data lama yang dihapus tidak dapat dipulihkan.

  • Solusi

    • Jika Anda menimpa tabel eksternal OSS berdasarkan data lamanya, misalnya, insert overwrite table T select * from table T;, backup data OSS terlebih dahulu. Jika job gagal, Anda dapat menimpa kembali tabel eksternal OSS berdasarkan data lama yang telah dibackup.

    • Jika job insert overwrite dapat dikirim ulang, cukup kirim ulang job tersebut jika gagal.

Solusi untuk kesalahan "table not found" saat mengakses tabel eksternal OSS dari Spark

  • Masalah

    Saat menggunakan Spark untuk mengakses tabel eksternal OSS, tugas gagal dengan kesalahan "table not found".

  • Solusi

    • Tambahkan parameter berikut:

      • Aktifkan konfigurasi tabel eksternal:spark.sql.catalog.odps.enableExternalTable=true;

      • Konfigurasikan wilayah tempat OSS berada:spark.hadoop.odps.oss.region.default=cn-<region>

    • Jika kesalahan tetap terjadi setelah menambahkan parameter di atas, seperti yang ditunjukkan di bawah ini:

      image

      Buat ulang tabel eksternal OSS lalu akses kembali.

Referensi