Jawaban atas pertanyaan umum mengenai fungsi bawaan MaxCompute, dikelompokkan berdasarkan kategori.
Date functions
Bagaimana cara mengonversi tanggal seperti 2010/1/3 menjadi 2010-01-03?
Untuk input dengan zero-padding (misalnya, 2010/01/03), gabungkan TO_DATE dan TO_CHAR:
SELECT TO_CHAR(TO_DATE('2010/01/03', 'yyyy/mm/dd'), 'yyyy-mm-dd');
-- Returns: 2010-01-03Untuk input tanpa zero-padding (misalnya, 2010/1/3), fungsi bawaan tidak dapat menguraikannya secara langsung. Tulis user-defined function (UDF). Topik ini menjelaskan jenis, skenario, proses pengembangan, dan catatan penggunaan UDF yang didukung di MaxCompute.
Bagaimana cara mengonversi UNIX timestamp ke nilai DATETIME?
Gunakan FROM_UNIXTIME:
SELECT FROM_UNIXTIME(1609459200);
-- Returns: 2021-01-01 08:00:00Untuk informasi lebih lanjut, lihat FROM_UNIXTIME.
Bagaimana cara mendapatkan waktu sistem saat ini?
Gunakan GETDATE:
SELECT GETDATE();
-- Returns the current date and time, e.g., 2026-02-15 10:30:00Untuk informasi lebih lanjut, lihat GETDATE.
Mengapa saya mendapatkan error "cannot be resolved" saat menggunakan YEAR, QUARTER, MONTH, atau DAY?
FAILED: ODPS-0130071:[1,8] Semantic analysis exception - function or view 'year' cannot be resolvedYEAR, QUARTER, MONTH, dan DAY adalah extension function yang diperkenalkan di MaxCompute V2.0. Fungsi-fungsi tersebut memerlukan edisi tipe data V2.0.
Tambahkan pengaturan berikut sebelum pernyataan SQL Anda:
SET odps.sql.type.system.odps2 = true;
SELECT YEAR(GETDATE());Mengapa TO_DATE gagal dengan error "missing minute part"?
FAILED: ODPS-0121095:Invalid arguments - format string has second part, but doesn't have minute part : yyyy-MM-dd HH:mm:ssDi MaxCompute, baik mm maupun MM merepresentasikan bulan. Gunakan mi untuk menit:
-- Incorrect
SELECT TO_DATE('2016-07-18 18:18:18', 'yyyy-MM-dd HH:mm:ss');
-- Correct
SELECT TO_DATE('2016-07-18 18:18:18', 'yyyy-MM-dd HH:mi:ss');Hal ini berbeda dari banyak platform SQL lainnya di mana mm merepresentasikan menit. Di MaxCompute, selalu gunakan mi untuk komponen menit.
Mathematical functions
Mengapa ROUND(4.515, 2) menghasilkan 4.51 bukan 4.52?
Nilai DOUBLE adalah bilangan titik mengambang 8-byte dengan presisi terbatas. Nilai 4.515 disimpan secara internal sebagai kira-kira 4.514999999..., sehingga pembulatan ke dua tempat desimal menghasilkan 4.51:
SELECT ROUND(4.515, 2), ROUND(125.315, 2);
-- Returns: 4.51, 125.32Untuk pembulatan eksak, gunakan tipe DECIMAL:
SELECT ROUND(4.515BD, 2);
-- Returns: 4.52Tipe DECIMAL menyimpan nilai dengan presisi eksak, sehingga menghindari masalah representasi bilangan titik mengambang.
Window functions
Bagaimana cara menghasilkan urutan auto-increment?
Gunakan ROW_NUMBER sebagai window function:
SELECT ROW_NUMBER() OVER (ORDER BY id) AS row_num, *
FROM my_table;Untuk informasi lebih lanjut, lihat ROW_NUMBER.
Aggregate functions
Bagaimana cara menggabungkan nilai-nilai dalam suatu kolom?
Gunakan WM_CONCAT:
SELECT WM_CONCAT(',', name) AS all_names
FROM my_table;
-- Returns: Alice,Bob,CharlieUntuk informasi lebih lanjut, lihat WM_CONCAT.
String functions
Apakah MaxCompute mendukung MD5?
Ya. MD5 menghitung hash dari sebuah string:
SELECT MD5('hello');
-- Returns: 5d41402abc4b2a76b9719d911017c592Untuk informasi lebih lanjut, lihat MD5.
Bagaimana cara melakukan left pad pada string dengan angka nol?
Gunakan LPAD:
SELECT LPAD('42', 6, '0');
-- Returns: 000042Untuk informasi lebih lanjut, lihat LPAD.
Apakah MaxCompute mendukung SUBSTRING_INDEX?
Ya. SUBSTRING_INDEX bekerja sama seperti di MySQL:
SELECT SUBSTRING_INDEX('www.example.com', '.', 2);
-- Returns: www.exampleUntuk informasi lebih lanjut, lihat SUBSTRING_INDEX.
Apakah REGEXP_COUNT mendukung nested query pada parameter pattern?
Tidak. Parameter pattern dari REGEXP_COUNT tidak mendukung pernyataan kueri bersarang.
Untuk informasi lebih lanjut, lihat REGEXP_COUNT.
Apakah MaxCompute mendukung pemformatan angka TO_CHAR ala Oracle?
MaxCompute tidak mendukung sintaks Oracle TO_CHAR(Data, FM9999.00). Gunakan FORMAT_NUMBER sebagai gantinya:
SELECT FORMAT_NUMBER(12332.123456, '#,###,###,###.###');
-- Returns: 12,332.123Untuk informasi lebih lanjut, lihat FORMAT_NUMBER.
Complex type functions
Bagaimana cara mengagregasi bidang JSON yang sesuai dengan suatu kondisi?
Filter catatan dengan kondisi SQL seperti LIKE, lalu gunakan ARRAY atau MAP untuk membuat tipe kompleks dari hasilnya. Konversi hasilnya ke string JSON dengan TO_JSON:
SELECT TO_JSON(ARRAY(col1, col2))
FROM my_table
WHERE col1 LIKE '%keyword%';Bagaimana cara mengekstrak kunci JSON sebagai kolom terpisah?
Gunakan GET_JSON_OBJECT:
SELECT
GET_JSON_OBJECT(json_col, '$.name') AS name,
GET_JSON_OBJECT(json_col, '$.age') AS age
FROM my_table;Untuk informasi lebih lanjut, lihat GET_JSON_OBJECT.
Bagaimana cara mengonversi string JSON ke array?
Gunakan FROM_JSON dengan tipe target sebagai string:
SELECT FROM_JSON(json_col, 'array<bigint>');
-- Converts a JSON array string like "[1, 2, 3]" to a MaxCompute ARRAY<BIGINT>Untuk informasi lebih lanjut, lihat FROM_JSON.
Other functions
MaxCompute tidak mendukung IFNULL. Apa yang harus saya gunakan sebagai gantinya?
MaxCompute tidak memiliki fungsi IFNULL. Jika Anda mencoba menggunakannya, Anda akan mendapatkan:
Semantic analysis exception - Invalid function : line 1:41 'ifnull'Gunakan salah satu alternatif berikut:
| Function | Syntax | Use when |
|---|---|---|
NVL | NVL(expr, default_value) | Pengganti langsung untuk IFNULL MySQL — mengembalikan default_value jika expr bernilai NULL |
COALESCE | COALESCE(expr1, expr2, ...) | Diperlukan beberapa nilai fallback — mengembalikan ekspresi pertama yang tidak NULL |
CASE WHEN | CASE WHEN expr IS NULL THEN default_value ELSE expr END | Logika kondisional kompleks yang melampaui pemeriksaan NULL sederhana |
Untuk sebagian besar kasus, NVL merupakan pengganti langsung yang paling sederhana:
-- MySQL
SELECT IFNULL(col, 0) FROM my_table;
-- MaxCompute equivalent
SELECT NVL(col, 0) FROM my_table;Untuk informasi lebih lanjut, lihat NVL, COALESCE, CASE WHEN expression, dan function mappings between MaxCompute, Hive, MySQL, and Oracle.
Bagaimana cara memisahkan satu baris menjadi beberapa baris?
Gunakan TRANS_COLS. Outputnya mencakup kolom indeks diikuti oleh kolom data yang ditransposisikan, sehingga jumlah alias harus sama dengan 1 + jumlah kolom data:
SELECT TRANS_COLS(2, col1, col2) AS (idx, key, value)
FROM my_table;Untuk informasi lebih lanjut, lihat TRANS_COLS.
Mengapa saya mendapatkan error "Expression not in GROUP BY key" saat menggunakan COALESCE?
FAILED: ODPS-0130071:Semantic analysis exception - Expression not in GROUP BY key : line 8:9 "$.table"Error ini terjadi ketika ekspresi non-agregat di dalam COALESCE mereferensikan kolom yang tidak tercantum dalam GROUP BY.
Pada contoh berikut, kueri gagal karena get_json_object(extended_x, '$.table') di dalam decode tidak diagregasikan dan tidak ada di GROUP BY:
SELECT
md5(concat(aid, bid)) AS id,
aid,
bid,
sum(amountdue) AS amountdue,
coalesce(
sum(regexp_count(get_json_object(extended_x, '$.table.tableParties'), '{')),
decode(get_json_object(extended_x, '$.table'), null, 0, 1)
) AS tableparty
FROM e_orders
WHERE pt = '20170425'
GROUP BY aid, bid;Ekspresi decode(get_json_object(extended_x, '$.table'), null, 0, 1) beroperasi pada baris individual tetapi muncul di luar fungsi agregat apa pun. Bungkus ekspresi tersebut dalam fungsi agregat atau sertakan dalam klausa GROUP BY.
Implicit type conversions
Mengapa saya mendapatkan error konversi tipe implisit setelah mengaktifkan MaxCompute V2.0?
Ketika edisi tipe data MaxCompute V2.0 diaktifkan (odps.sql.type.system.odps2=true), konversi tipe implisit berikut dinonaktifkan:
| Source type | Target type |
|---|---|
| STRING | BIGINT |
| STRING | DATETIME |
| DOUBLE | BIGINT |
| DECIMAL | DOUBLE |
| DECIMAL | BIGINT |
Konversi ini dapat menyebabkan kehilangan presisi, sehingga V2.0 memblokirnya secara default. Untuk mengatasinya:
Konversi eksplisit (disarankan): Gunakan
CASTuntuk mengonversi tipe secara eksplisit. Untuk informasi lebih lanjut, lihat CAST.SELECT CAST(string_col AS BIGINT) FROM my_table;Nonaktifkan tipe data V2.0: Atur
odps.sql.type.system.odps2=falseuntuk mengaktifkan kembali konversi implisit. Perhatikan bahwa pengaturan ini juga dapat menonaktifkan extension function V2.0 sepertiYEAR,QUARTER,MONTH, danDAY, tergantung pada konfigurasi tingkat proyek.