Topik ini menjelaskan cara mengimpor data dari Tablestore (Open Table Service, sebelumnya OTS) ke MaxCompute untuk menghubungkan berbagai sumber data secara mulus.
Informasi latar belakang
Tablestore adalah layanan penyimpanan data NoSQL yang dibangun di atas sistem terdistribusi Alibaba Cloud Apsara. Tablestore menyediakan penyimpanan dan akses real-time ke sejumlah besar data terstruktur. Untuk informasi selengkapnya, lihat dokumentasi Tablestore.
Anda dapat menggunakan DataWorks bersama MaxCompute untuk membuat, mencari, mengkueri, mengonfigurasi, memproses, dan menganalisis tabel eksternal secara visual. Untuk informasi selengkapnya, lihat Tabel eksternal.
Catatan Penggunaan
Anda harus memastikan konektivitas jaringan antara MaxCompute dan Tablestore. Saat mengakses data Tablestore dari MaxCompute di cloud publik, kami menyarankan Anda menggunakan titik akhir privat Tablestore. Titik akhir privat diakhiri dengan ots-internal.aliyuncs.com, misalnya, tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com.
Tablestore dan MaxCompute menggunakan sistem tipe data yang berbeda. Tabel berikut mencantumkan pemetaan antara tipe data yang didukung oleh Tablestore dan MaxCompute.
Tipe MaxCompute
Tipe Tablestore
STRING
STRING
BIGINT
INTEGER
DOUBLE
DOUBLE
BOOLEAN
BOOLEAN
BINARY
BINARY
Tabel eksternal Tablestore tidak mendukung atribut pengelompokan.
Prasyarat
Anda telah diberikan izin untuk mengakses Tablestore. Untuk informasi lebih lanjut tentang otorisasi, lihat Otorisasi STS untuk Tablestore.
Instans Tablestore, tabel, dan data telah dibuat. Untuk informasi selengkapnya, lihat Panduan Cepat untuk model tabel lebar.
Buat tabel eksternal
MaxCompute menyediakan fitur tabel eksternal. Anda dapat menggunakan tabel eksternal untuk mengimpor data dari Tablestore ke sistem meta MaxCompute guna diproses. Bagian berikut menjelaskan cara membuat tabel eksternal Tablestore.
Berikut ini adalah contoh pernyataan CREATE FOREIGN TABLE.
DROP TABLE IF EXISTS ots_table_external;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
(
odps_orderkey bigint,
odps_orderdate string,
odps_custkey bigint,
odps_orderstatus string,
odps_totalprice double,
odps_createdate timestamp
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
WITH SERDEPROPERTIES (
'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey,o_orderstatus,o_totalprice',
'tablestore.table.name'='ots_tpch_orders',
'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole',
'tablestore.read.mode'='permissive',
'tablestore.corrupt.column'='ColumnName',
'tablestore.timestamp.ticks.unit'='seconds',
'tablestore.column.odps_createdate.timestamp.ticks.unit'='millis',
'tablestore.table.put.row'='true'
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';Tabel berikut menjelaskan parameter utama yang digunakan dalam pernyataan pembuatan tabel di atas.
Parameter | Diperlukan | Deskripsi |
com.aliyun.odps.TableStoreStorageHandler | Ya | Penanganan penyimpanan bawaan MaxCompute yang digunakan untuk memproses data Tablestore. Penanganan penyimpanan ini mendefinisikan interaksi antara MaxCompute dan Tablestore. Logika terkait diimplementasikan oleh MaxCompute. |
tablestore.columns.mapping | Ya | Kolom tabel Tablestore yang ingin diakses oleh MaxCompute. Kolom-kolom ini mencakup kolom kunci primer dan kolom atribut.
|
tablestore.table.name | Ya | Nama tabel Tablestore yang ingin diakses oleh MaxCompute. Pada contoh ini, namanya adalah |
odps.properties.rolearn | Ya | Nama Sumber Daya Alibaba Cloud (ARN) dari AliyunODPSDefaultRole di RAM.
|
tablestore.timestamp.ticks.unit | Tidak | Pengaturan tipe waktu tingkat tabel. Parameter ini menentukan bahwa semua bidang tipe data INTEGER dalam tabel eksternal menggunakan unit waktu yang sama. Nilai valid:
|
tablestore.column.<col1_name>.timestamp.ticks.unit | Tidak | Pengaturan tipe waktu tingkat kolom. Parameter ini menentukan unit waktu suatu kolom dalam tabel eksternal. Nilai valid:
Catatan Jika kedua parameter tablestore.timestamp.ticks.unit dan tablestore.column.<col1_name>.timestamp.ticks.unit dikonfigurasi, maka parameter tablestore.column.<col1_name>.timestamp.ticks.unit memiliki prioritas lebih tinggi. |
tablestore.table.put.row | Tidak | Menentukan mode tulis operasi PutRow. Nilai valid:
Catatan Anda dapat mengonfigurasi parameter flag berikut untuk menentukan mode penulisan operasi PutRow. Nilai default-nya adalah False. Untuk informasi selengkapnya, lihat Daftar parameter flag. |
tablestore.read.mode | Tidak | Menentukan perilaku pembacaan jika MaxCompute mendeteksi data kotor dalam tabel eksternal Tablestore. Nilai valid:
Untuk contoh penanganan data rusak, lihat Contoh penanganan data rusak. |
tablestore.corrupt.column | Tidak | Menentukan kolom tempat data kotor ditulis.
Untuk contoh penanganan data rusak, lihat Contoh penanganan data rusak. |
LOCATION | Ya | Menentukan informasi tentang Tablestore, seperti nama dan titik akhir instance Tablestore. Anda harus menyelesaikan otorisasi RAM atau Security Token Service (STS) untuk memastikan akses aman ke data Tablestore. Catatan Jika kesalahan yang menunjukkan ketidaksesuaian jenis jaringan dikembalikan saat Anda menggunakan titik akhir publik, Anda dapat mengubah jenis jaringan ke jaringan klasik. |
Anda dapat mengeksekusi pernyataan berikut untuk melihat struktur tabel eksternal yang telah dibuat:
DESC extended <table_name>;Dalam hasil eksekusi, Extended Info mencakup informasi dasar tentang tabel eksternal, informasi penanganan penyimpanan, dan lokasi tabel eksternal.
Lakukan kueri data pada tabel eksternal
Setelah membuat tabel eksternal, Anda dapat menjalankan pernyataan SQL MaxCompute untuk mengakses data Tablestore menggunakan tabel eksternal tersebut. Contoh:
SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
FROM ots_table_external
WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
GROUP BY odps_orderkey, odps_orderdate
HAVING sum_total> 400000.0;Saat melakukan kueri pada tabel eksternal atau bidang, nama tabel dan nama bidang tidak peka huruf besar/kecil, dan konversi paksa huruf besar/kecil tidak didukung.
Jika Anda mengakses data Tablestore menggunakan pernyataan SQL MaxCompute, semua operasi—seperti pemilihan nama kolom—dilakukan di MaxCompute. Pada contoh di atas, nama kolomnya adalah odps_orderkey dan odps_totalprice, bukan nama kolom kunci primer o_orderkey dan kolom atribut o_totalprice pada tabel Tablestore. Hal ini karena pemetaannya telah ditentukan dalam pernyataan DDL yang digunakan untuk membuat tabel eksternal. Anda juga dapat mempertahankan nama kolom kunci primer dan kolom atribut pada tabel Tablestore sesuai kebutuhan.
Jika Anda ingin menghitung satu data beberapa kali, Anda dapat mengimpor data dari Tablestore ke tabel internal MaxCompute. Dengan cara ini, Anda tidak perlu membaca data dari Tablestore setiap kali ingin menghitung data menggunakan MaxCompute. Contoh:
CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
WHERE odps_orderkey > 5000 ;internal_orders adalah tabel MaxCompute yang mendukung semua fitur tabel internal MaxCompute. Tabel internal_orders menggunakan penyimpanan kolom terkompresi secara efisien dan berisi data makro internal lengkap serta informasi statistik. Tabel internal_orders disimpan di MaxCompute, sehingga Anda dapat mengaksesnya lebih cepat daripada tabel Tablestore. Metode ini cocok untuk data yang perlu dihitung berkali-kali.
Ekspor data dari MaxCompute ke Tablestore
MaxCompute tidak secara aktif membuat tabel tujuan Tablestore. Pastikan tabel tersebut ada sebelum mengekspor data ke tabel Tablestore. Jika tidak, kesalahan akan dilaporkan.
Tabel eksternal bernama ots_table_external telah dibuat agar MaxCompute dapat mengakses tabel ots_tpch_orders di Tablestore. Data tersebut disimpan di tabel internal MaxCompute bernama internal_orders. Jika Anda ingin memproses data pada tabel internal_orders lalu menulis kembali data yang telah diproses ke Tablestore, Anda dapat menjalankan pernyataan insert overwrite table pada tabel eksternal. Contoh:
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;Jika data pada tabel internal MaxCompute diurutkan berdasarkan kunci primer, data tersebut akan ditulis ke satu partisi tunggal pada tabel Tablestore. Dalam kasus ini, Anda tidak dapat memanfaatkan sepenuhnya operasi penulisan terdistribusi. Dalam skenario ini, kami menyarankan Anda menggunakan distribute by rand() untuk mendistribusikan data secara acak. Contoh:
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM (SELECT * FROM internal_orders DISTRIBUTE BY rand()) t;Tablestore adalah layanan penyimpanan data NoSQL yang menyimpan data dalam format pasangan kunci-nilai. Output data dari MaxCompute hanya memengaruhi baris yang mencakup kunci primer tabel Tablestore. Dalam contoh ini, hanya baris yang mencakup odps_orderkey dan odps_orderdate yang terpengaruh. Hanya kolom atribut yang ditentukan saat membuat tabel ots_table_external yang diperbarui. Kolom yang tidak termasuk dalam tabel eksternal tidak dimodifikasi.
Jika ukuran data yang ingin Anda tulis dari MaxCompute ke Tablestore sekaligus lebih besar dari 4 MB, kesalahan mungkin terjadi. Dalam kasus ini, Anda harus menghapus data berlebih lalu menulis ulang data ke Tablestore.
ODPS-0010000:System internal error - Output to TableStore failed with exception: TableStore BatchWrite request id XXXXX failed with error code OTSParameterInvalid and message:The total data size of BatchWriteRow request exceeds the limitMenulis beberapa entri data sekaligus atau per baris dianggap sebagai satu operasi. Untuk informasi lebih lanjut, lihat BatchWriteRow. Jika ingin menulis sejumlah besar data sekaligus, Anda dapat menulis data per baris.
Jika ingin menulis beberapa entri data sekaligus, pastikan Anda tidak menulis baris duplikat. Jika baris duplikat ada, kesalahan berikut mungkin terjadi:
ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalidUntuk informasi selengkapnya, lihat Kesalahan OTSParameterInvalid saat menggunakan BatchWriteRow untuk mengirimkan 100 entri data sekaligus.
Karena Tablestore merupakan layanan penyimpanan kunci-nilai, saat Anda menggunakan
insert overwrite tableuntuk menulis data ke tabel Tablestore, seluruh isi tabel Tablestore tujuan tidak dihapus. Hanya nilai kunci yang cocok dengan kunci pada tabel sumber yang ditimpa.
Contoh penanganan data rusak
Buat tabel Tablestore bernama
mf_ots_testdan siapkan data. Untuk informasi selengkapnya, lihat Panduan Cepat untuk model tabel lebar.Kode sampel berikut menunjukkan data default tabel Tablestore.
+----+-----------+---------------------------+ | id | name | desc | +----+-----------+---------------------------+ | 1 | Zhang San | Zhang San's description | +----+-----------+---------------------------+Buat tabel eksternal MaxCompute.
CREATE EXTERNAL TABLE IF NOT EXISTS mf_ots_external_permi ( id string, name bigint, desc string, corrupt_col string ) STORED BY 'com.aliyun.odps.TableStoreStorageHandler' WITH SERDEPROPERTIES ( 'tablestore.columns.mapping'=':id,name,desc', 'tablestore.table.name'='mf_ots_test', 'tablestore.read.mode'='permissive', 'tablestore.corrupt.column'='corrupt_col', 'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole' ) LOCATION 'tablestore://santie-doc.cn-shanghai.ots-internal.aliyuncs.com';Jalankan kode berikut untuk menanyakan data dalam tabel eksternal MaxCompute:
-- Query data SELECT * FROM mf_ots_external_permi;Hasil berikut dikembalikan. Bidang kesalahan ditulis ke kolom
corrupt_coldalam format JSON.+------------+------------+--------------------------+------------------------+ | id | name | desc | corrupt_col | +------------+------------+--------------------------+------------------------+ | 1 | NULL | Description of Zhang San | {"name": "\"Zhang San\""} | +------------+------------+--------------------------+------------------------+CatatanJika tablestore.read.mode tidak dikonfigurasi atau diatur ke permissive tetapi tablestore.corrupt.column tidak dikonfigurasi untuk menentukan kolom tempat data rusak ditulis, pesan kesalahan
"Columns not match with columns mapping and corrupt column"akan dikembalikan saat Anda melakukan kueri pada tabel eksternal.
FAQ
Bagaimana cara mengatasi job SQL lambat pada tabel eksternal Tablestore?
Kueri lambat pada tabel eksternal Tablestore
Gejala
Kueri pada tabel eksternal Tablestore berjalan lambat. Untuk data bisnis yang sama, satu salinan ditulis ke Tablestore secara real-time, dan salinan lainnya ditulis ke MaxCompute secara terjadwal. Skema tabel dan volume data identik. Kueri pada tabel internal MaxCompute jauh lebih cepat dibandingkan kueri pada tabel eksternal Tablestore.
Solusi
Masalah ini dapat terjadi jika Anda menjalankan beberapa komputasi pada dataset yang sama. Alih-alih membaca data dari Tablestore untuk setiap kueri, metode yang lebih efisien adalah mengimpor data yang diperlukan ke tabel internal MaxCompute lalu menjalankan kueri Anda pada tabel internal tersebut.
Pencarian data lambat pada tabel eksternal MaxCompute menggunakan SDK
Gejala
Pencarian data pada tabel eksternal MaxCompute yang menggunakan kit pengembangan perangkat lunak (SDK) berjalan lambat.
Solusi
Tabel eksternal hanya mendukung pemindaian tabel penuh, yang dapat menyebabkan performa lambat. Gunakan tabel internal MaxCompute sebagai gantinya.