全部产品
Search
文档中心

DataWorks:Kembangkan tugas skrip MaxCompute

更新时间:Jul 06, 2025

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 Variable untuk 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 DESC dan SHOW, 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 AS dalam 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;
Catatan

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 ELSE menentukan 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; 
    Catatan

    Variabel 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 ELSE menentukan 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.