全部产品
Search
文档中心

MaxCompute:SELECT TRANSFORM

更新时间:Jun 19, 2025

Pernyataan SELECT TRANSFORM memungkinkan Anda untuk memulai proses anak yang ditentukan dan menggunakan input standar untuk memasukkan data dalam format yang diperlukan. Kemudian, Anda dapat mengurai output standar dari proses anak untuk mendapatkan data keluaran. Pernyataan SELECT TRANSFORM memungkinkan Anda menjalankan skrip dalam bahasa pemrograman lain tanpa perlu menulis fungsi tabel terdefinisi pengguna (UDTF).

Deskripsi

Kinerja SELECT TRANSFORM dan UDTF bervariasi berdasarkan skenario. Hasil uji perbandingan menunjukkan bahwa SELECT TRANSFORM lebih unggul daripada UDTF ketika Anda mengquery sejumlah kecil data. Namun, UDTF lebih unggul daripada SELECT TRANSFORM ketika Anda mengquery sejumlah besar data. SELECT TRANSFORM mudah dikembangkan dan lebih cocok untuk query ad hoc.

SELECT TRANSFORM kompatibel dengan berbagai bahasa pemrograman, memungkinkan Anda menulis skrip sederhana dalam perintah untuk mengimplementasikan fitur tertentu. Bahasa seperti AWK, Python, Perl, dan Shell mendukung operasi ini, sehingga tidak diperlukan langkah tambahan seperti menulis file skrip atau mengunggah sumber daya. Untuk fitur yang lebih kompleks, Anda dapat mengunggah file skrip. Untuk informasi lebih lanjut, lihat Contoh pemanggilan skrip Python dan Contoh pemanggilan skrip Java.

Tabel berikut menunjukkan hasil perbandingan antara UDTF dan SELECT TRANSFORM di berbagai dimensi.

Kategori

select transform

UDTF

Tipe Data

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

Hasil output dan parameter input UDTF mendukung beberapa tipe data.

Transmisi Data

Transmisi data didasarkan pada pipeline sistem operasi. Namun, ukuran cache pipeline hanya 4 KB dan tidak dapat diubah. Jika pipeline kosong atau sepenuhnya terisi, SELECT TRANSFORM tidak dapat dieksekusi.

SELECT TRANSFORM memanggil sistem bawah untuk membaca dan menulis data selama transmisi data. Pernyataan ini memberikan kinerja yang lebih tinggi dalam transmisi data dibandingkan program Java.

Tidak ada batasan yang diberlakukan pada cache pipeline.

Transmisi Parameter Konstan

Parameter konstan perlu ditransmisikan.

Parameter konstan secara opsional ditransmisikan.

Proses

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

Satu proses digunakan.

Kinerja

SELECT TRANSFORM mendukung alat dengan kode asli seperti AWK, sehingga memungkinkan SELECT TRANSFORM memberikan kinerja lebih tinggi dibandingkan program Java.

Kinerja rendah.

Batasan

PHP dan Ruby tidak diterapkan pada kluster komputasi MaxCompute. Oleh karena itu, Anda tidak dapat memanggil skrip PHP atau Ruby di MaxCompute.

Sintaksis

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>))
  • Kata kunci SELECT TRANSFORM: wajib. Anda dapat menggantinya dengan kata kunci map atau reduce yang memiliki semantik serupa. Untuk sintaksis yang lebih jelas, disarankan menggunakan SELECT TRANSFORM.

  • arg1,arg2...: wajib. Parameter ini menentukan data masukan. Formatnya sama dengan pernyataan SELECT. Dalam format default, hasil ekspresi untuk setiap parameter secara implisit dikonversi menjadi nilai tipe STRING, kemudian digabungkan dengan \t dan diteruskan ke proses anak yang ditentukan.

  • Klausa ROW FORMAT: opsional. Klausa ini memungkinkan Anda menyesuaikan format data masukan dan keluaran.

    Dua klausa ROW FORMAT digunakan dalam sintaksis. Klausa pertama menentukan format data masukan, sedangkan klausa kedua menentukan format data keluaran. Secara default, \t digunakan sebagai pembatas kolom, \n sebagai pembatas baris, dan \N untuk merepresentasikan nilai null.

    null
    • Hanya satu karakter yang dapat digunakan sebagai field_delimiter atau character_escape. Jika Anda menentukan string untuk parameter ini, karakter pertama dalam string yang digunakan.

    • MaxCompute mendukung sintaksis dalam format yang ditentukan oleh Apache Hive, seperti inputRecordReader, outputRecordReader, dan SerDe. Anda harus mengaktifkan edisi tipe data yang kompatibel dengan Hive untuk menggunakan sintaksis ini. Tambahkan set odps.sql.hive.compatible=true; sebelum pernyataan SQL. Untuk informasi lebih lanjut tentang sintaksis yang didukung oleh Apache Hive, lihat Dokumentasi Hive.

    • Jika Anda menentukan sintaksis yang didukung oleh Apache Hive, seperti inputRecordReader atau outputRecordReader, pernyataan SQL mungkin dieksekusi dengan kecepatan lebih rendah.

  • Klausa USING: wajib. Klausa ini menentukan perintah yang digunakan untuk memulai proses anak.

    • Dalam sebagian besar pernyataan SQL MaxCompute, klausa USING menentukan sumber daya. Namun, dalam pernyataan SELECT TRANSFORM, klausa USING menentukan perintah untuk memulai proses anak. Klausa USING juga memastikan kompatibilitas dengan sintaksis Apache Hive.

    • Sintaksis klausa USING mirip dengan sintaksis skrip shell. Namun, alih-alih menjalankan skrip shell, klausa USING membuat proses anak berdasarkan perintah yang Anda tentukan. Oleh karena itu, beberapa fitur shell, seperti pengalihan input dan output, pipeline, dan loop, tidak dapat digunakan. Skrip shell dapat digunakan sebagai perintah untuk memulai proses anak jika diperlukan.

  • Klausa RESOURCES: opsional. Klausa ini menentukan sumber daya yang dapat diakses oleh proses anak. Anda dapat menggunakan salah satu metode berikut untuk menentukan sumber daya:

    • Gunakan klausa RESOURCES untuk menentukan sumber daya, seperti using 'sh foo.sh bar.txt' resources 'foo.sh','bar.txt'.

    • Gunakan set odps.sql.session.resources untuk menentukan sumber daya. Misalnya, tambahkan flag set odps.sql.session.resources=foo.sh,bar.txt; sebelum pernyataan SQL untuk menentukan sumber daya.

      Setelah konfigurasi global ini diterapkan, semua pernyataan SELECT TRANSFORM dapat mengakses sumber daya. Pisahkan beberapa file sumber daya dengan koma (,).

  • Klausa AS: opsional. Klausa ini menentukan kolom keluaran dan tipe datanya, seperti as(col1 bigint, col2 boolean).

    • Jika Anda tidak menentukan tipe data untuk kolom keluaran, tipe data default STRING digunakan. Misalnya, AS(col1, col2) menunjukkan bahwa kolom keluaran bertipe STRING.

    • Data keluaran diperoleh dengan mengurai output standar dari proses anak. Jika data yang ditentukan bukan bertipe STRING, MaxCompute secara implisit memanggil fungsi CAST untuk mengonversi tipe data menjadi STRING. Pengecualian waktu proses mungkin terjadi selama konversi.

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

    • Jika Anda menghilangkan klausa AS, bidang sebelum \t pertama dalam data output standar adalah kunci dan semua bagian berikutnya adalah nilai. Ini setara dengan AS(key, value).

Contoh memanggil perintah shell

Jalankan perintah shell untuk menghasilkan 50 baris data mulai dari 1 hingga 50. Outputnya adalah bidang data. Gunakan output perintah shell sebagai input 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 memanggil perintah Python

Gunakan perintah Python untuk menghasilkan 50 baris data mulai dari 1 hingga 50. Outputnya adalah bidang data. Gunakan output perintah Python sebagai input 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 memanggil perintah AWK

Buat tabel uji. Jalankan perintah AWK untuk memberikan kolom kedua dari tabel uji sebagai output. Data output adalah bidang data. Gunakan output perintah AWK sebagai input SELECT TRANSFORM. Contoh pernyataan:

-- Buat tabel uji. 
create table testdata(c1 bigint,c2 bigint);
-- Masukkan data uji ke dalam 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 memanggil perintah Perl

Buat tabel uji. Jalankan perintah Perl untuk memberikan data dari tabel uji sebagai output. Data output adalah bidang data. Gunakan output perintah Perl sebagai input SELECT TRANSFORM. Contoh pernyataan:

-- Buat tabel uji. 
create table testdata(c1 bigint,c2 bigint);
-- Masukkan data uji ke dalam 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 memanggil 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 sumber daya ke MaxCompute.

    add py ./myplus.py -f;
    null

    Anda juga dapat menggunakan konsol DataWorks untuk menambahkan file Python sebagai sumber daya. Untuk informasi lebih lanjut, lihat Buat dan gunakan sumber daya MaxCompute.

  3. Eksekusi pernyataan SELECT TRANSFORM untuk memanggil file ini.

    -- Buat tabel uji. 
    create table testdata(c1 bigint,c2 bigint);
    -- Masukkan data uji ke dalam 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 memanggil 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 sebagai sumber daya 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 dalam 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   |
    +-----+
null

Java dan Python memiliki kerangka UDTF siap pakai. Namun, SELECT TRANSFORM mempermudahkan penulisan skrip tanpa memerlukan dependensi tambahan atau persyaratan format tertentu, bahkan memungkinkan penggunaan skrip offline secara langsung. Direktori untuk menyimpan skrip Java offline dapat diperoleh dari variabel lingkungan JAVA_HOME, sedangkan direktori untuk skrip Python offline dapat diperoleh dari variabel lingkungan PYTHON_HOME.

Contoh memanggil skrip secara seri

Anda dapat mengeksekusi pernyataan SELECT TRANSFORM secara seri dengan menggunakan klausa 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 yang digunakan untuk memulai proses anak.

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

@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;