All Products
Search
Document Center

MaxCompute:SELECT TRANSFORM

Last Updated:Aug 25, 2026

Pernyataan SELECT TRANSFORM memungkinkan Anda menjalankan proses anak tertentu dan menggunakan standard input untuk memasukkan data dalam format yang diperlukan. Kemudian, Anda dapat mengurai standard output dari proses anak tersebut untuk mendapatkan data keluaran. Pernyataan SELECT TRANSFORM memungkinkan Anda menjalankan skrip dalam bahasa pemrograman lain tanpa perlu menulis user-defined table-valued function (UDTF).

Deskripsi

Kinerja antara SELECT TRANSFORM dan UDTF bervariasi tergantung pada skenario. Hasil pengujian perbandingan menunjukkan bahwa SELECT TRANSFORM lebih unggul saat menangani volume data kecil, sedangkan UDTF lebih unggul untuk volume data besar. Selain itu, SELECT TRANSFORM lebih mudah dikembangkan dan cocok untuk kueri ad hoc.

SELECT TRANSFORM kompatibel dengan berbagai bahasa pemrograman, memungkinkan Anda menulis skrip langsung dalam perintah untuk mengimplementasikan fitur sederhana. Bahasa seperti AWK, Python, Perl, dan Shell didukung, sehingga Anda tidak perlu menulis file skrip terpisah atau mengunggah resource—proses pengembangan pun menjadi lebih sederhana. Untuk fitur kompleks, Anda dapat mengunggah file skrip. Untuk informasi selengkapnya, lihat Contoh pemanggilan skrip Python dan Contoh pemanggilan skrip Java.

Tabel berikut membandingkan UDTF dan SELECT TRANSFORM dalam berbagai dimensi.

Kategori

select transform

UDTF

Tipe data

Proses anak menggunakan standard input dan output untuk mentransmisikan data. Semua data diproses sebagai string, sehingga konversi tipe data diperlukan jika menggunakan SELECT TRANSFORM.

Parameter masukan dan hasil keluaran UDTF mendukung berbagai tipe data.

Transmisi data

Transmisi data didasarkan pada pipeline sistem operasi dengan ukuran cache tetap 4 KB yang tidak dapat diubah. Jika pipeline kosong atau penuh, SELECT TRANSFORM tidak dapat dieksekusi.

SELECT TRANSFORM memanggil sistem dasar untuk membaca dan menulis data selama transmisi, sehingga memberikan kinerja lebih tinggi dibandingkan program Java.

Tidak ada batasan pada cache pipeline.

Transmisi parameter konstan

Parameter konstan perlu ditransmisikan.

Parameter konstan bersifat opsional untuk ditransmisikan.

Proses

SELECT TRANSFORM mendukung proses induk dan anak. Jika penggunaan sumber daya komputasi tinggi dan throughput data rendah, fitur multi-core server dapat dimanfaatkan.

Menggunakan proses tunggal.

Kinerja

SELECT TRANSFORM mendukung kode native dari alat seperti AWK. Hal ini memungkinkan SELECT TRANSFORM memberikan kinerja lebih tinggi dibandingkan program Java.

Kinerja rendah.

Batasan

PHP dan Ruby tidak dideploy pada kluster komputasi MaxCompute, sehingga skrip PHP atau Ruby tidak dapat dipanggil di MaxCompute.

Sintaks

select transform(<arg1>, <arg2> ...) 
[(row format delimited (fields terminated by <field_delimiter> (escaped by <character_escape>)) (null defined as <null_value>))]
using '<unix_command_line>' 
(resources '<res_name>' (',' '<res_name>')*)
[(as <col1>, <col2> ...)]
(row format delimited (fields terminated by <field_delimiter> (escaped by <character_escape>)) (null defined as <null_value>))
  • SELECT TRANSFORM keyword: wajib. Kata kunci ini dapat diganti dengan map atau reduce yang memiliki semantik sama. Untuk kejelasan sintaks, disarankan menggunakan SELECT TRANSFORM.

  • arg1,arg2...: wajib. Parameter ini menentukan data masukan dengan format yang sama seperti pada pernyataan SELECT. Dalam format default, hasil ekspresi setiap parameter secara implisit dikonversi ke tipe STRING, lalu digabung menggunakan \t dan diteruskan ke proses anak.

  • ROW FORMAT clause: opsional. Klausul ini memungkinkan penyesuaian format data masukan dan keluaran.

    Dua klausul ROW FORMAT digunakan dalam sintaks: yang pertama menentukan format data masukan, dan yang kedua menentukan format data keluaran. Secara default, \t digunakan sebagai pemisah kolom, \n sebagai pemisah baris, dan \N untuk merepresentasikan nilai null.

    Catatan
    • Hanya satu karakter yang dapat digunakan sebagai field_delimiter atau character_escape. Jika Anda menentukan string, hanya karakter pertama yang akan digunakan.

    • MaxCompute mendukung sintaks dalam format yang ditentukan oleh Apache Hive, seperti inputRecordReader, outputRecordReader, dan SerDe. Untuk menggunakan sintaks ini, aktifkan edisi tipe data yang kompatibel dengan Hive dengan menambahkan set odps.sql.hive.compatible=true; sebelum pernyataan SQL. Informasi lebih lanjut tentang sintaks Hive tersedia di dokumentasi Hive.

    • Penggunaan sintaks Apache Hive seperti inputRecordReader atau outputRecordReader dapat menyebabkan eksekusi SQL menjadi lebih lambat.

  • USING clause: wajib. Klausul ini menentukan perintah untuk menjalankan proses anak.

    • Pada sebagian besar pernyataan SQL MaxCompute, klausul USING menentukan resource. Namun, klausul USING dalam pernyataan SELECT TRANSFORM menentukan perintah untuk menjalankan proses anak. Klausul USING digunakan untuk memastikan kompatibilitas dengan sintaks Apache Hive.

    • Sintaks klausul USING mirip dengan skrip shell, tetapi bukan menjalankan skrip shell secara langsung—melainkan membuat proses anak berdasarkan perintah yang ditentukan. Oleh karena itu, fitur shell seperti pengalihan input/output, pipeline, dan loop tidak dapat digunakan. Skrip shell dapat digunakan sebagai perintah jika diperlukan.

  • RESOURCES clause: opsional. Klausul ini menentukan resource yang dapat diakses oleh proses anak. Anda dapat menentukan resource dengan salah satu cara berikut:

    • Gunakan klausul RESOURCES, misalnya: using 'sh foo.sh bar.txt' resources 'foo.sh','bar.txt'.

    • Gunakan set odps.sql.session.resources=foo.sh,bar.txt; sebelum pernyataan SQL untuk menentukan resource secara global.

      Setelah konfigurasi ini diterapkan, semua pernyataan SELECT TRANSFORM dapat mengakses resource tersebut. Pisahkan beberapa file resource dengan koma (,).

  • AS clause: opsional. Klausul ini menentukan kolom keluaran beserta tipe datanya, contohnya: as(col1 bigint, col2 boolean).

    • Jika tipe data tidak ditentukan, tipe default adalah STRING. Misalnya, AS(col1, col2) berarti kedua kolom bertipe STRING.

    • Data keluaran diperoleh dengan mengurai standard output dari proses anak. Jika kolom keluaran bukan bertipe STRING, MaxCompute secara implisit memanggil fungsi CAST untuk mengonversinya ke STRING. Pengecualian waktu proses mungkin terjadi selama konversi ini.

    • Anda tidak dapat menentukan tipe data hanya untuk sebagian kolom, seperti as(col1, col2:bigint).

    • Jika klausul AS dihilangkan, bidang sebelum \t pertama dalam standard output dianggap sebagai key, dan sisanya sebagai value—setara dengan AS(key, value).

Contoh pemanggilan perintah shell

Jalankan perintah shell untuk menghasilkan 50 baris data dari 1 hingga 50. Keluarannya adalah bidang data, yang kemudian digunakan sebagai masukan untuk SELECT TRANSFORM. Contoh pernyataan:

select transform(script) using 'sh' as (data) 
from (
        select  'for i in `seq 1 50`; do echo $i; done' as script
      ) t
;
-- Pernyataan di atas setara dengan pernyataan berikut: 
select transform('for i in `seq 1 50`; do echo $i; done') using 'sh' as (data);

Hasil berikut dikembalikan:

+------------+
| data       |
+------------+
| 1          |
| 2          |
| 3          |
| 4          |
| 5          |
| 6          |
| 7          |
| 8          |
| 9          |
| 10         |
| 11         |
| 12         |
| 13         |
| 14         |
| 15         |
| 16         |
| 17         |
| 18         |
| 19         |
| 20         |
| 21         |
| 22         |
| 23         |
| 24         |
| 25         |
| 26         |
| 27         |
| 28         |
| 29         |
| 30         |
| 31         |
| 32         |
| 33         |
| 34         |
| 35         |
| 36         |
| 37         |
| 38         |
| 39         |
| 40         |
| 41         |
| 42         |
| 43         |
| 44         |
| 45         |
| 46         |
| 47         |
| 48         |
| 49         |
| 50         |
+------------+

Contoh pemanggilan perintah Python

Gunakan perintah Python untuk menghasilkan 50 baris data dari 1 hingga 50. Keluarannya adalah bidang data, yang kemudian digunakan sebagai masukan untuk SELECT TRANSFORM. Contoh pernyataan:

select transform(script) using 'python' as (data) 
from (
        select  'for i in xrange(1, 51):  print(i);' as script
      ) t
;
-- Pernyataan di atas setara dengan pernyataan berikut: 
select transform('for i in xrange(1, 51):  print(i);') using 'python' as (data);

Hasil berikut dikembalikan:

+------------+
| data       |
+------------+
| 1          |
| 2          |
| 3          |
| 4          |
| 5          |
| 6          |
| 7          |
| 8          |
| 9          |
| 10         |
| 11         |
| 12         |
| 13         |
| 14         |
| 15         |
| 16         |
| 17         |
| 18         |
| 19         |
| 20         |
| 21         |
| 22         |
| 23         |
| 24         |
| 25         |
| 26         |
| 27         |
| 28         |
| 29         |
| 30         |
| 31         |
| 32         |
| 33         |
| 34         |
| 35         |
| 36         |
| 37         |
| 38         |
| 39         |
| 40         |
| 41         |
| 42         |
| 43         |
| 44         |
| 45         |
| 46         |
| 47         |
| 48         |
| 49         |
| 50         |
+------------+

Contoh pemanggilan perintah AWK

Buat tabel uji, lalu jalankan perintah AWK untuk mengambil kolom kedua sebagai keluaran. Data keluaran adalah bidang data, yang digunakan sebagai masukan untuk SELECT TRANSFORM. Contoh pernyataan:

-- Buat tabel uji. 
create table testdata(c1 bigint,c2 bigint);
-- Masukkan data uji ke tabel uji.  
insert into table testdata values (1,4),(2,5),(3,6); 
-- Eksekusi pernyataan SELECT TRANSFORM.  
select transform(*) using "awk '//{print $2}'" as (data) from testdata;

Hasil berikut dikembalikan:

+------------+
| data       |
+------------+
| 4          |
| 5          |
| 6          |
+------------+

Contoh pemanggilan perintah Perl

Buat tabel uji, lalu jalankan perintah Perl untuk mengambil data dari tabel tersebut sebagai keluaran. Data keluaran adalah bidang data, yang digunakan sebagai masukan untuk SELECT TRANSFORM. Contoh pernyataan:

-- Buat tabel uji. 
create table testdata(c1 bigint,c2 bigint);
-- Masukkan data uji ke tabel uji.  
insert into table testdata values (1,4),(2,5),(3,6); 
-- Eksekusi pernyataan SELECT TRANSFORM.  
select transform(testdata.c1, testdata.c2) using "perl -e 'while($input = <STDIN>){print $input;}'" from testdata;

Hasil berikut dikembalikan:

+------------+------------+
| key        | value      |
+------------+------------+
| 1          | 4          |
| 2          | 5          |
| 3          | 6          |
+------------+------------+

Contoh pemanggilan skrip Python

  1. Buat file myplus.py. Contoh pernyataan:

    #!/usr/bin/env python
    import sys
    line = sys.stdin.readline()
    while line:
        token = line.split('\t')
        if (token[0] == '\\N') or (token[1] == '\\N'):
            print('\\N')
        else:
            print(str(token[0]) +'\t' + str(token[1]))
        line = sys.stdin.readline()
  2. Tambahkan file skrip Python sebagai resource ke MaxCompute.

    add py ./myplus.py -f;
    Catatan

    Anda juga dapat menggunakan Konsol DataWorks untuk menambahkan file Python sebagai resource. Untuk informasi selengkapnya, lihat Buat dan gunakan resource MaxCompute.

  3. Eksekusi pernyataan SELECT TRANSFORM untuk memanggil file ini.

    -- Buat tabel uji. 
    create table testdata(c1 bigint,c2 bigint);
    -- Masukkan data uji ke tabel uji.  
    insert into table testdata values (1,4),(2,5),(3,6); 
    -- Eksekusi pernyataan SELECT TRANSFORM.  
    select 
    transform (testdata.c1, testdata.c2) 
    using 'python myplus.py' resources 'myplus.py' 
    as (result1,result2) 
    from testdata;
    -- Pernyataan di atas setara dengan pernyataan berikut: 
    set odps.sql.session.resources=myplus.py;
    select transform (testdata.c1, testdata.c2) 
    using 'python myplus.py' 
    as (result1,result2) 
    from testdata;

    Hasil berikut dikembalikan:

    +------------+------------+
    | result1    | result2    |
    +------------+------------+
    | 1          | 4          |
    |            | NULL       |
    | 2          | 5          |
    |            | NULL       |
    | 3          | 6          |
    |            | NULL       |
    +------------+------------+

Contoh pemanggilan skrip Java

  1. Tulis skrip Java dan ekspor sebagai file Sum.jar. Contoh kode Java:

    package com.aliyun.odps.test;
    import java.util.Scanner;
    public class Sum {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            while (sc.hasNext()) {
                String s = sc.nextLine();
                String[] tokens = s.split("\t");
                if (tokens.length < 2) {
                    throw new RuntimeException("illegal input");
                }
                if (tokens[0].equals("\\N") || tokens[1].equals("\\N")) {
                    System.out.println("\\N");
                }
                System.out.println(Long.parseLong(tokens[0]) + Long.parseLong(tokens[1]));
            }
        }
    }
  2. Tambahkan file tersebut sebagai resource ke MaxCompute.

    add jar ./Sum.jar -f;
  3. Eksekusi pernyataan SELECT TRANSFORM untuk memanggil file ini.

    -- Buat tabel uji. 
    create table testdata(c1 bigint,c2 bigint); 
    -- Masukkan data uji ke tabel uji. 
    insert into table testdata values (1,4),(2,5),(3,6); 
    -- Eksekusi pernyataan SELECT TRANSFORM. 
    select transform(testdata.c1, testdata.c2) using 'java -cp Sum.jar com.aliyun.odps.test.Sum' resources 'Sum.jar' as cnt from testdata;
    -- Pernyataan di atas setara dengan pernyataan berikut: 
    set odps.sql.session.resources=Sum.jar; 
    select transform(testdata.c1, testdata.c2) using 'java -cp Sum.jar com.aliyun.odps.test.Sum' as cnt from testdata;

    Hasil berikut dikembalikan:

    +-----+
    | cnt |
    +-----+
    | 5   |
    | 7   |
    | 9   |
    +-----+
Catatan

Java dan Python memiliki framework UDTF siap pakai. Namun, SELECT TRANSFORM mempermudah penulisan skrip karena tidak memerlukan dependensi tambahan atau format khusus, bahkan dapat langsung menggunakan skrip offline. Direktori penyimpanan skrip Java offline dapat diperoleh dari variabel lingkungan JAVA_HOME, sedangkan direktori skrip Python offline dari variabel lingkungan PYTHON_HOME.

Contoh pemanggilan skrip secara berurutan

Anda dapat mengeksekusi pernyataan SELECT TRANSFORM secara berurutan dengan menggunakan klausul DISTRIBUTE BY dan SORT BY untuk memproses data masukan terlebih dahulu. Contoh pernyataan:

select transform(key, value) using '<cmd2>' from 
(
    select transform(*) using '<cmd1>' from 
    (
        select * from testdata distribute by c2 sort by c1 
    ) t distribute by key sort by value 
) t2;

cmd1 dan cmd2 adalah perintah untuk menjalankan proses anak.

Anda juga dapat menggunakan kata kunci map dan reduce untuk mengeksekusi pernyataan SELECT TRANSFORM secara berurutan.

@a := select * from data distribute by col2 sort by col1;
@b := map * using 'cmd1' distribute by col1 sort by col2 from @a;
reduce * using 'cmd2' from @b;