Topik ini menjelaskan cara membuat tabel eksternal OSS dan menggunakan penanganan penyimpanan kustom untuk membaca serta menulis data ke tabel tersebut.
Applicability
Tabel eksternal OSS tidak mendukung properti cluster.
Satu file tidak boleh melebihi 2 GB. Jika ukuran file terlalu besar, lakukan pemisahan.
Create an external table
Syntax
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 '<YOUR_DEFINED_STORAGEHANDLER>'
WITH serdeproperties (
['property_name'='property_value',...]
)
location 'oss_location'
USING 'jar_name';Untuk menghindari masalah kebenaran data, penanganan penyimpanan kustom tidak melakukan sharding data secara default. Jika Anda yakin bahwa penanganan penyimpanan Anda dapat menangani sharding, Anda dapat mengaktifkan fitur sharding data untuk menjalankan beberapa mapper dengan menjalankan perintah berikut:
SET odps.sql.unstructured.data.single.file.split.enabled=true;Common parameters
Untuk informasi selengkapnya tentang parameter umum, lihat Basic syntax parameters.
Exclusive parameters
Parameter | Required | Description |
your_defined_storagehandler | Yes | Anda dapat menggunakan user-defined function (UDF) MaxCompute untuk menulis custom resolver. Untuk informasi selengkapnya, lihat Develop UDFs. |
jar_name | Yes | Paket JAR yang berisi kode penanganan penyimpanan kustom. Paket JAR tersebut harus ditambahkan sebagai resource ke proyek MaxCompute. Untuk informasi selengkapnya tentang cara menambahkan resource, lihat Resource operations. |
resource_name | No | Ketika Anda menggunakan serde class kustom, Anda harus menentukan resource dependensi. Resource tersebut berisi serde class kustom. Paket JAR yang berisi serde class tersebut harus ditambahkan sebagai resource ke proyek MaxCompute. Untuk informasi selengkapnya tentang cara menambahkan resource, lihat Resource operations. |
Write data
Untuk informasi selengkapnya tentang sintaks penulisan data MaxCompute, lihat Write data to OSS.
Query and analysis
Untuk informasi selengkapnya tentang sintaks SELECT, lihat Read OSS data.
Untuk informasi selengkapnya tentang cara mengoptimalkan rencana kueri, lihat Query optimization.
Example: Create an OSS external table using a custom storage handler
Buat pemetaan dengan direktori SampleData/ (penanganan penyimpanan kustom) di Appendix: Prepare sample data. Prosedurnya sebagai berikut:
Prasyarat
Bucket OSS dan folder tersedia. Untuk informasi selengkapnya, lihat Create a bucket dan Manage folders.
MaxCompute mendukung pembuatan folder otomatis di OSS. Jika suatu pernyataan SQL melibatkan tabel eksternal dan user-defined function (UDF), Anda dapat menggunakan satu pernyataan untuk membaca dan menulis ke tabel sekaligus menggunakan UDF tersebut. Anda juga dapat membuat folder secara manual.
MaxCompute hanya dideploy di wilayah tertentu. Untuk menghindari potensi masalah koneksi data lintas wilayah, pastikan bucket OSS Anda berada di wilayah yang sama dengan proyek MaxCompute Anda.
Otorisasi
Anda harus memiliki izin untuk mengakses OSS. Anda dapat menggunakan Akun Alibaba Cloud, pengguna Resource Access Management (RAM), atau peran RAM untuk mengakses tabel eksternal OSS. Untuk informasi selengkapnya tentang otorisasi, lihat Authorize access in STS mode for OSS.
Anda harus memiliki izin CreateTable di proyek MaxCompute. Untuk informasi selengkapnya tentang izin tabel, lihat MaxCompute permissions.
Gunakan MaxCompute Studio untuk membuat empat kelas Java berikut: TextExtractor.java, TextOutputer.java, SplitReader.java, dan TextStorageHandler.java. Untuk informasi selengkapnya tentang cara mengembangkan program Java, lihat Develop a UDF.
Gunakan fitur pengemasan satu klik MaxCompute Studio untuk mengemas TextStorageHandler.java dan unggah sebagai resource MaxCompute.
Asumsikan nama resource-nya adalah
javatest-1.0-SNAPSHOT.jar. Untuk informasi selengkapnya tentang pengemasan dan pengunggahan, lihat Package, upload, and register.CatatanJika diperlukan beberapa dependensi, kemas secara terpisah dan unggah sebagai resource MaxCompute.
Jalankan pernyataan berikut untuk membuat tabel eksternal OSS:
CREATE EXTERNAL TABLE ambulance_data_txt_external ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongtitue DOUBLE, recordTime STRING, direction STRING ) stored BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' WITH serdeproperties ( 'delimiter'='|', 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/SampleData/' USING 'javatest-1.0-SNAPSHOT.jar'; -- Anda dapat menjalankan pernyataan desc extended ambulance_data_txt_external; untuk melihat struktur tabel eksternal yang telah dibuat.CatatanParameter delimiter adalah delimiter yang ditentukan pengguna untuk memisahkan nilai kolom pada setiap baris objek OSS. Anda dapat menggunakan string valid apa pun sebagai delimiter.
Baca data dari OSS. Contoh pernyataan:
SELECT recordId, patientId, direction FROM ambulance_data_txt_external WHERE patientId > 25;Hasil berikut dikembalikan:
+----------+-----------+-----------+ | recordid | patientid | direction | +----------+-----------+-----------+ | 1 | 51 | S | | 3 | 48 | NE | | 4 | 30 | W | | 5 | 47 | S | | 7 | 53 | N | | 8 | 63 | SW | | 10 | 31 | N | +----------+-----------+-----------+Tulis data ke tabel eksternal OSS.
INSERT INTO ambulance_data_txt_external VALUES (1,16,76,1,'46.81006','-92.08174','9/14/2014 0:10','SW'); -- Kueri data lagi untuk memeriksa apakah data telah ditulis. Anda juga dapat memeriksa apakah file baru dihasilkan di direktori OSS. SELECT * FROM ambulance_data_txt_external WHERE recordId='16';
FAQ
Mengapa error ODPS-0123131 muncul ketika saya menggunakan Extractor kustom untuk membaca bidang data DATETIME dari data tidak terstruktur?
Gejala
Ketika Anda menggunakan Extractor kustom untuk membaca data tidak terstruktur, error berikut dikembalikan jika bidang data bertipe DATETIME, seperti 2019-11-11 06:43:36.
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.IllegalArgumentException at java.sql.Date.valueOf(Date.java:143) at com.aliyun.odps.udf.example.text.TextExtractor.textLineToRecord(TextExtractor.java:194) at com.aliyun.odps.udf.example.text.TextExtractor.extract(TextExtractor.java:153) at com.aliyun.odps.udf.ExtractorHandler.extract(ExtractorHandler.java:120)Penyebab
Error terjadi pada
Date.valueOf(parts). Fungsijava.sql.Date.valueOf()hanya mendukung parameter string dalam format"yyyy-[m]m-[d]d". Fungsi ini tidak mendukung format DATETIME.Solusi
Tambahkan dependensi Joda-Time dan impor kelas yang diperlukan ke dalam kode Anda.
-- Dependency. <dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>2.10</version> </dependency> -- Import information. import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat;Gunakan fungsi
DateTimeFormat.forPattern()untuk mengonversi nilai DATETIME menjadi string saat Anda membaca data.record.setDate(index, new Date(DateTime.parse(parts[i], DateTimeFormat.forPattern("yyyy-MM-dd HH:mi:ss")).getMillis()));
Berikut contohnya.
Gunakan klien MaxCompute untuk mengunggah paket JAR yang dihasilkan dari proyek Extractor.
add jar /Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jar/Users/gary/big_data/odps/text_extractor/target/text_extractor-1.0-SNAPSHOT.jaradalah path lokal tempat paket JAR yang dihasilkan disimpan.Gunakan klien MaxCompute untuk mengunggah paket JAR pihak ketiga Joda-Time.
add jar /Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jar/Users/gary/.m2/repository/joda-time/joda-time/2.10/joda-time-2.10.jaradalah path lokal tempat paket JAR pihak ketiga Joda-Time disimpan.Unggah file data uji, seperti
video_play_log.txt, ke direktori yang ditentukan di OSS. File tersebut dapat berisi data sampel berikut.5c661071dba64d5080c91da085ff1073^music-click-fast_forward^26.12.XX.XX^2019-11-11 06:43:36Baca data dari tabel eksternal.
select * from <project_name>.video_play_log;Hasil berikut dikembalikan.
+------+-------+---+----------------+ | uuid | action | ip | time | +------+-------+---+----------------+ | 5c661071dba64d5080c91da085ff1073 | music-click-fast_forward | 26.12.XX.XX | 2019-11-11 06:43:36 | +------+-------+---+----------------+