DataWorks menyediakan Node ODPS Script untuk mengembangkan tugas skrip MaxCompute di editor kode yang disediakan oleh mesin SQL MaxCompute V2.0. Topik ini menjelaskan cara menggunakan Node ODPS Script untuk mengembangkan tugas skrip MaxCompute.
Prasyarat
Sebuah Node ODPS Script telah dibuat. Untuk informasi lebih lanjut, lihat Buat dan Kelola Node ODPS.
Informasi latar belakang
Mesin SQL MaxCompute mendukung mode skrip. Dalam mode skrip, file skrip SQL yang berisi beberapa pernyataan SQL dikompilasi secara keseluruhan. Setiap pernyataan dalam file skrip SQL tidak perlu dikompilasi secara terpisah. Mode skrip digunakan dalam skenario di mana pernyataan tunggal dengan subquery bersarang perlu ditulis ulang, atau skrip kompleks harus dibagi menjadi beberapa pernyataan. Setelah file skrip SQL dikompilasi, file tersebut dikirimkan ke MaxCompute, dan rencana eksekusi dihasilkan. Dengan cara ini, pernyataan dalam file skrip SQL dijadwalkan dalam satu antrian dan dieksekusi sekali. Ini memungkinkan Anda untuk sepenuhnya memanfaatkan sumber daya di MaxCompute. Untuk informasi lebih lanjut, lihat SQL dalam Mode Skrip. Di DataWorks, Anda dapat membuat Node ODPS Script untuk mengembangkan kode untuk tugas skrip MaxCompute dalam mode skrip, dan mengintegrasikan tugas skrip MaxCompute dengan tugas lainnya.
Skenario
Anda dapat menggunakan mode skrip dalam skenario berikut:
Pernyataan tunggal dengan subquery bersarang perlu ditulis ulang, atau skrip kompleks harus dibagi menjadi beberapa pernyataan.
Mode skrip tidak berlaku dalam skenario ini: Data dari beberapa sumber data perlu ditambahkan dan interval waktu yang lama untuk persiapan data ada di antara sumber data yang berbeda. Sebagai contoh, data dari sumber data siap pada pukul 01:00, dan data dari sumber data lainnya siap pada pukul 07:00. Dalam hal ini, variabel tabel tidak cocok untuk mengemas beberapa pernyataan dalam file skrip SQL.
Anda harus menetapkan nilai konstan ke variabel dan mengeksekusi pernyataan
SELECT * FROM Variableuntuk mengonversi variabel menjadi nilai skalar. Nilai skalar digunakan bersama dengan kolom lainnya untuk perhitungan. Nilai konstan juga dapat disimpan dalam tabel yang hanya memiliki satu baris. Pernyataan berikut memberikan contoh. Untuk informasi lebih lanjut tentang sintaks pernyataan SELECT * FROM Variable, lihat Subqueries.@a := SELECT 10; -- Tetapkan nilai konstan 10 ke @a. Anda juga dapat menggunakan SELECT col1 FROM t1 untuk menetapkan nilai konstan yang disimpan dalam tabel t1 yang hanya memiliki satu baris ke @a. @b := SELECT key,value+(SELECT * FROM @a) FROM t2 WHERE key >10000; -- Gunakan nilai @a dengan nilai dalam tabel t2 untuk perhitungan. SELECT * FROM @b;
Sintaks
Skrip MaxCompute lengkap berisi pernyataan SET, pernyataan DDL, dan pernyataan DML. Anda dapat menyertakan nol atau lebih pernyataan dari setiap jenis dalam skrip. Namun, pernyataan dari jenis yang berbeda tidak dapat dicampur. Tanda at (@) sebelum pernyataan menunjukkan bahwa pernyataan-pernyataan tersebut dihubungkan menggunakan variabel. Sintaks:
-- Pernyataan SET
set odps.sql.type.system.odps2=true;
[set odps.stage.reducer.num=***;]
[...]
-- Pernyataan DDL
create table table1 xxx;
[create table table2 xxx;]
[...]
-- Pernyataan DML
@var1 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table3
[WHERE where_condition];
@var2 := SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM table4
[WHERE where_condition];
@var3 := SELECT [ALL | DISTINCT] var1.select_expr, var2.select_expr, ...
FROM @var1 join @var2 on ...;
INSERT OVERWRITE|INTO TABLE [PARTITION (partcol1=val1, partcol2=val2 ...)]
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM @var3;
[@var4 := SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var1
UNION ALL | UNION
SELECT [ALL | DISTINCT] var1.select_expr, var.select_expr, ... FROM @var2;
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
AS
SELECT [ALL | DISTINCT] select_expr, select_expr, ...
FROM var4;]Batasan
Berikut adalah batasan yang diberlakukan saat Anda menggunakan Node ODPS Script:
Node ODPS Script mendukung pernyataan SET, pernyataan DML, dan beberapa pernyataan DDL dalam mode skrip. Pernyataan DDL yang menampilkan hasil, seperti
DESCdanSHOW, tidak didukung.
Anda hanya dapat menulis satu pernyataan yang menampilkan hasil, seperti pernyataan SELECT, dalam skrip. Jika Anda menulis beberapa pernyataan semacam itu dalam skrip, kesalahan akan terjadi. Kami menyarankan agar Anda tidak menggunakan pernyataan SELECT yang menampilkan hasil dalam skrip.
Anda hanya dapat menulis satu pernyataan
CREATE TABLE ASdalam skrip, dan pernyataan ini harus menjadi pernyataan terakhir dalam skrip. Kami menyarankan agar Anda menulis pernyataan CREATE TABLE dan INSERT di bagian yang berbeda untuk memisahkannya.Dalam mode skrip, jika salah satu pernyataan dalam skrip gagal, seluruh skrip gagal.
Dalam mode skrip, pekerjaan dihasilkan untuk memproses data hanya setelah semua data input disiapkan untuk skrip.
Dalam mode skrip, jika Anda menentukan pernyataan untuk menulis data ke tabel dan kemudian pernyataan untuk membaca data dari tabel dalam skrip yang sama, kesalahan akan terjadi. Sebagai contoh, jika Anda menulis pernyataan berikut dalam skrip, kesalahan akan terjadi:
insert overwrite table src2 select * from src where key > 0; @a := select * from src2; select * from @a;Untuk menghindari kesalahan, ubah pernyataan sebelumnya menjadi pernyataan berikut:
@a := select * from src where key > 0; insert overwrite table src2 select * from @a; select * from @a;
Contoh pengeditan kode sederhana
Node ODPS Script memungkinkan Anda menulis pernyataan SQL berdasarkan logika bisnis Anda dengan cara yang mirip dengan bahasa pemrograman umum. Anda tidak perlu mempertimbangkan bagaimana mengatur pernyataan SQL. Contoh berikut menjelaskan cara menggunakan Node ODPS Script:
create table if not exists dest(key string , value bigint) ;
create table if not exists dest2(key string,value bigint ) ;
@a := select * from src where value >0;
@b := select * from src2 where key is not null;
@c := select * from src3 where value is not null;
@d := select a.key,b.value from @a left outer join @b on a.key=b.key and b.value>0;
@e := select a.key,c.value from @a inner join @c on a.key=c.key;
@f := select * from @d union select * from @e union select * from @a;
insert overwrite table dest select * from @f;
@g := select e.key,c.value from @e join @c on e.key=c.key;
insert overwrite table dest2 SELECT * from @g;Dalam contoh ini, tabel src, src1, dan src2 digunakan. Pernyataan untuk membuat tabel:
-- Buat tabel.
create table if not EXISTS src(key string ,value BIGINT);
insert into src values ('1',11) ;
insert into src values ('1',11) ;
create table if not EXISTS src2(key string ,value BIGINT);
insert into src2 values ('1',22);
insert into src2 values ('2',22);
create table if not EXISTS src3(key string ,value BIGINT);
insert into src3 values ('1',33);
insert into src3 values ('3',33);Contoh pengeditan kode lanjutan
Mode skrip MaxCompute mendukung pernyataan IF. Pernyataan IF memungkinkan sistem secara otomatis memilih logika eksekusi berdasarkan kondisi tertentu. MaxCompute mendukung sintaks IF berikut berdasarkan jenis kondisi: BOOLEAN dan subquery skalar tipe BOOLEAN.
Kondisi IF adalah ekspresi tipe BOOLEAN.
Ekspresi tipe BOOLEAN dalam pernyataan
IF ELSEmenentukan cabang mana yang akan dieksekusi selama kompilasi kode. Contoh kode:-- Pemrosesan data set odps.sql.allow.fullscan=true; set odps.optimizer.cbo.rule.filter.black=LM; @date := '${var}'; @row TABLE(key int,value bigint); -- Deklarasikan variabel baris. Jenis baris adalah TABLE dan skema adalah tipe data STRING. IF ( cast(@date as bigint) % 2 == 0 ) BEGIN @row := SELECT key,value from src1; END ELSE BEGIN @row := SELECT key,value from src2; END INSERT OVERWRITE TABLE dest1 partition(p='${var}') SELECT key,value FROM @row;CatatanVariabel bernama var didefinisikan dalam kode. Anda perlu menetapkan nilai ke variabel var di bagian Parameter Penjadwalan tab Properti.
Kondisi IF adalah subquery skalar tipe BOOLEAN.
Subquery skalar tipe BOOLEAN dalam pernyataan
IF ELSEmenentukan cabang mana yang akan dieksekusi selama pelaksanaan pekerjaan daripada selama kompilasi kode. Oleh karena itu, Anda harus mengirimkan beberapa pekerjaan. Contoh kode:@i bigint; @t table(id bigint, value bigint); IF ((SELECT count(*) FROM src WHERE a = '5') > 1) BEGIN @i := 1; @t := select @i, @i*2; END ELSE BEGIN @i := 2; @t := select @i, @i*2; END select id, value from @t;Pengembangan Fungsi Terdefinisi Pengguna (UDF) Tersemat
Anda dapat menggunakan mode skrip MaxCompute untuk menerapkan pengembangan UDF tersemat dengan menyematkan kode Java atau Python ke dalam skrip SQL. Untuk informasi lebih lanjut, lihat UDF Tersemat Kode.
Apa yang harus dilakukan selanjutnya
Setelah Anda menyelesaikan pengembangan tugas menggunakan node yang dibuat, Anda dapat melakukan operasi berikut:
Konfigurasikan properti penjadwalan: Anda dapat mengonfigurasi properti untuk penjadwalan periodik node. Jika Anda ingin sistem secara berkala menjadwalkan dan menjalankan tugas, Anda harus mengonfigurasi item untuk node, seperti pengaturan rerun dan dependensi penjadwalan. Untuk informasi lebih lanjut, lihat Ikhtisar.
Debug node: Anda dapat men-debug dan menguji kode node untuk memeriksa apakah logika kode sesuai dengan harapan Anda. Untuk informasi lebih lanjut, lihat Prosedur Debugging.
Deploy node: Setelah Anda menyelesaikan semua operasi pengembangan, Anda dapat mendeploy node. Setelah node dideploy, sistem secara berkala menjadwalkan node berdasarkan properti penjadwalan node. Untuk informasi lebih lanjut, lihat Deploy Node.