全部产品
Search
文档中心

MaxCompute:Tulis ulang pernyataan SQL yang tidak kompatibel

更新时间:Jul 02, 2025

Topik ini menjelaskan cara memodifikasi pernyataan SQL yang tidak kompatibel dengan MaxCompute V2.0.

Informasi latar belakang

MaxCompute V2.0 sepenuhnya merangkul ekosistem open source, mendukung lebih banyak bahasa pemrograman dan fitur, serta memberikan performa yang lebih tinggi. Versi ini juga memeriksa sintaksis secara lebih ketat, sehingga kesalahan mungkin muncul untuk beberapa pernyataan yang menggunakan sintaksis kurang ketat namun berhasil dieksekusi di versi sebelumnya.

Untuk memastikan peningkatan bertahap ke MaxCompute V2.0 berjalan lancar, kerangka kerja MaxCompute mendukung rollback. Jika MaxCompute V2.0 gagal mengeksekusi pekerjaan, MaxCompute V1.0 akan mengeksekusi pekerjaan tersebut sebagai gantinya. Rollback meningkatkan latensi pekerjaan. Sebelum mengirimkan pekerjaan, disarankan untuk mengonfigurasi set odps.sql.planner.mode=lot; guna menonaktifkan fitur rollback secara manual. Hal ini mencegah dampak dari modifikasi pada kebijakan rollback MaxCompute.

Tim MaxCompute akan memberi tahu pemilik pekerjaan yang memerlukan pernyataan SQL tidak dapat dieksekusi melalui email atau DingTalk berdasarkan kondisi rollback online. Pemilik pekerjaan harus memodifikasi pernyataan SQL untuk pekerjaan tersebut sesegera mungkin. Jika tidak, pekerjaan tersebut mungkin gagal.

group.by.with.star

Pernyataan ini setara dengan pernyataan select * … group by….
  • Dalam MaxCompute V2.0, semua kolom tabel sumber harus disertakan dalam klausa GROUP BY. Jika tidak, kesalahan akan dikembalikan.
  • Dalam versi sebelumnya MaxCompute, select * from group by key didukung meskipun tidak semua kolom tabel sumber disertakan dalam klausa GROUP BY.
Contoh
  • Skenario 1: Kunci GROUP BY tidak mencakup semua kolom.
    • Sintaksis tidak valid:
      select * from t group by key;
    • Pesan kesalahan:
      FAILED: ODPS-0130071:[1,8] Semantic analysis exception - column reference t.value should appear in GROUP BY key
    • Sintaksis valid:
      select distinct key from t;
  • Skenario 2: Kunci GROUP BY mencakup semua kolom.
    • Kami sarankan Anda tidak menggunakan sintaksis berikut:
      select * from t group by key, value; -- t memiliki kolom key dan value
    • Meskipun sintaksis sebelumnya tidak menyebabkan kesalahan di MaxCompute V2.0, kami sarankan Anda menggunakan sintaksis berikut:
      select distinct key, value from t;

bad.escape

Urutan escape tidak valid.

MaxCompute mendefinisikan bahwa, dalam literal string, setiap karakter ASCII yang berkisar dari 0 hingga 127 harus ditulis dalam format backslash (\) diikuti oleh tiga digit oktal. Misalnya, 0 ditulis sebagai \001, dan 1 ditulis sebagai \002. Namun, \01 dan \0001 diproses sebagai \001.

Metode ini membingungkan pengguna baru. Misalnya, "\0001" tidak dapat diproses sebagai "\000"+"1". Untuk pengguna yang memigrasikan data dari sistem lain ke MaxCompute, data yang tidak valid mungkin dihasilkan.
Catatan Jika angka ditambahkan ke \000, seperti angka dalam rentang \0001 hingga \0009 atau angka \00001, kesalahan mungkin dikembalikan.
MaxCompute V2.0 memperbaiki urutan dalam skrip untuk menangani masalah ini.
  • Sintaksis tidak valid:
    select split(key, "\01"), value like "\0001" from t;
  • Pesan kesalahan:
    FAILED: ODPS-0130161:[1,19] Parse exception - unexpected escape sequence: 01
    ODPS-0130161:[1,38] Parse exception - unexpected escape sequence: 0001
  • Sintaksis valid:
    select split(key, "\001"), value like "\001" from t;

column.repeated.in.creation

Jika nama kolom duplikat terdeteksi saat pernyataan CREATE TABLE dieksekusi, MaxCompute V2.0 mengembalikan kesalahan.

Contoh
  • Sintaksis tidak valid:
    create table t (a BIGINT, b BIGINT, a BIGINT);
  • Pesan kesalahan:
    FAILED: ODPS-0130071:[1,37] Semantic analysis exception - column repeated in creation: a
  • Sintaksis valid:
    create table t (a BIGINT, b BIGINT);

string.join.double

Anda ingin menggabungkan nilai tipe STRING dengan tipe DOUBLE.
  • Dalam versi awal MaxCompute, nilai tipe STRING dan DOUBLE dikonversi menjadi tipe BIGINT. Ini menyebabkan hilangnya presisi. Misalnya, 1.1 = "1" dalam kondisi JOIN dianggap sama.
  • Dalam MaxCompute V2.0, nilai tipe STRING dan DOUBLE dikonversi menjadi tipe DOUBLE karena MaxCompute V2.0 kompatibel dengan Hive.
Contoh
  • Sintaksis yang tidak direkomendasikan:
    select * from t1 join t2 on t1.double_value = t2.string_value;
  • Informasi peringatan:
    WARNING:[1,48]  implicit conversion from STRING to DOUBLE, potential data loss, use CAST function to suppress
  • Sintaksis yang direkomendasikan:
    select * from t1 join t2 on t.double_value = cast(t2.string_value as double);

window.ref.prev.window.alias

Fungsi jendela merujuk alias fungsi jendela lain dalam klausa SELECT tingkat yang sama.

Contoh
  • Anggap rn tidak ada di t1. Sintaksis tidak valid:
    select row_number() over (partition by c1 order by c1) rn,
    row_number() over (partition by c1 order by rn) rn2
    from t1;
  • Pesan kesalahan:
    FAILED: ODPS-0130071:[2,45] Semantic analysis exception - column rn cannot be resolved
  • Sintaksis valid:
    select row_number() over (partition by c1 order by rn) rn2
    from
    (select c1, row_number() over (partition by c1 order by c1) rn
    from t1
    ) tmp;

select.invalid.token.after.star

Klausa SELECT memungkinkan Anda menggunakan asterisk (*) untuk memilih semua kolom tabel. Namun, asterisk tidak dapat diikuti oleh alias meskipun asterisk hanya menentukan satu kolom. Editor baru mengembalikan kesalahan untuk sintaksis serupa.

Contoh
  • Sintaksis tidak valid:
    select * as alias from table_test;
  • Pesan kesalahan:
    FAILED: ODPS-0130161:[1,10] Parse exception - invalid token 'as'
  • Sintaksis valid:
    select * from table_test;

agg.having.ref.prev.agg.alias

Jika HAVING ada, klausa SELECT dapat merujuk alias fungsi agregat.

Contoh
  • Sintaksis tidak valid:
    select count(c1) cnt,
    sum(c1) / cnt avg
    from t1
    group by c2
    having cnt > 1;
  • Pesan kesalahan:
    FAILED: ODPS-0130071:[2,11] Semantic analysis exception - column cnt cannot be resolved
    ODPS-0130071:[2,11] Semantic analysis exception - column reference cnt should appear in GROUP BY key

    dan cnt tidak ada di tabel sumber t1. Namun, versi awal MaxCompute tidak mengembalikan kesalahan karena HAVING ada. Dalam MaxCompute V2.0, pesan kesalahan column cannot be resolve dikembalikan.

  • Sintaksis valid:
    select cnt, s, s/cnt avg
    from
    (
    select count(c1) cnt,
    sum(c1) s
    from t1
    group by c2
    having count(c1) > 1
    ) tmp;

order.by.no.limit

Dalam MaxCompute, klausa ORDER BY harus diikuti oleh klausa LIMIT untuk membatasi jumlah rekaman data. ORDER BY digunakan untuk mengurutkan semua rekaman data. Jika ORDER BY tidak diikuti oleh klausa LIMIT, kinerja eksekusi rendah.

Contoh
  • Sintaksis tidak valid:
    select * from (select *
    from (select cast(login_user_cnt as int) as uv, '3' as shuzi
    from test_login_cnt where type = 'device' and type_name = 'mobile') v
    order by v.uv desc) v
    order by v.shuzi limit 20;
  • Pesan kesalahan:
    FAILED: ODPS-0130071:[4,1] Semantic analysis exception - ORDER BY must be used with a LIMIT clause

Tambahkan klausa LIMIT ke subquery order by v.uv desc.

Dalam MaxCompute V1.0, pemeriksaan tampilan tidak ketat. Misalnya, tampilan dibuat dalam proyek yang tidak memerlukan pemeriksaan pada klausa LIMIT. odps.sql.validate.orderby.limit=false menunjukkan bahwa proyek tidak memerlukan pemeriksaan pada klausa LIMIT.
create view table_view as select id from table_view order by id;

Eksekusi pernyataan berikut untuk mengakses tampilan:

select * from table_view;

MaxCompute V1.0 tidak mengembalikan kesalahan, sedangkan MaxCompute V2.0 mengembalikan kesalahan berikut:

FAILED: ODPS-0130071:[1,15] Semantic analysis exception - while resolving view xdj.xdj_view_limit - ORDER BY must be used with a LIMIT clause

generated.column.name.multi.window

aliases yang dihasilkan secara otomatis digunakan.

Dalam versi awal MaxCompute, alias dihasilkan secara otomatis untuk setiap ekspresi pernyataan SELECT. Alias ditampilkan di klien MaxCompute. Namun, versi awal MaxCompute tidak menjamin aturan pembuatan alias benar atau tetap tidak berubah. Kami sarankan Anda tidak menggunakan alias yang dihasilkan secara otomatis.

MaxCompute V2.0 memperingatkan Anda terhadap penggunaan alias yang dihasilkan secara otomatis. Namun, MaxCompute V2.0 tidak melarang penggunaan alias yang dihasilkan secara otomatis untuk menghindari dampak buruk.

Dalam beberapa kasus, perubahan yang diketahui dilakukan pada aturan pembuatan alias di versi MaxCompute yang berbeda. Beberapa pekerjaan online bergantung pada alias yang dihasilkan secara otomatis. Pekerjaan ini mungkin gagal saat MaxCompute ditingkatkan atau dikembalikan. Jika Anda mengalami masalah ini, modifikasi query Anda dan tentukan secara eksplisit alias kolom.

Contoh
  • Sintaksis yang tidak direkomendasikan:
    select _c0 from (select count(*) from table_name) t;
  • Sintaksis yang direkomendasikan:
    select c from (select count(*) c from table_name) t;

non.boolean.filter

Kondisi filter NON-BOOLEAN digunakan.

MaxCompute melarang konversi implisit antara tipe BOOLEAN dan tipe data lainnya. Namun, versi awal MaxCompute mengizinkan penggunaan kondisi filter BIGINT dalam beberapa kasus. MaxCompute V2.0 melarang penggunaan kondisi filter BIGINT. Jika skrip Anda memiliki kondisi filter BIGINT, modifikasi mereka sesegera mungkin. Contoh:

Sintaksis tidak valid:

select id, count(*) from table_name group by id having id;

Pesan kesalahan:

FAILED: ODPS-0130071:[1,50] Semantic analysis exception - expect a BOOLEAN expression

Sintaksis valid:

select id, count(*) from table_name group by id having id <> 0;

post.select.ambiguous

Klausa ORDER BY, CLUSTER BY, DISTRIBUTE BY, dan SORT BY merujuk kolom dengan nama yang bertentangan.

Dalam versi awal MaxCompute, sistem secara otomatis memilih kolom terakhir dalam klausa SELECT sebagai objek operasi. Namun, MaxCompute V2.0 melaporkan kesalahan dalam kasus ini. Modifikasi query Anda sesegera mungkin. Contoh:

Sintaksis tidak valid:

select a, b as a from t order by a limit 10;

Pesan kesalahan:

FAILED: ODPS-0130071:[1,34] Semantic analysis exception - a is ambiguous, can be both t.a or null.a

Sintaksis valid:

select a as c, b as a from t order by a limit 10;

Perubahan ini mencakup pernyataan yang memiliki nama kolom yang bertentangan tetapi memiliki sintaksis yang sama. Meskipun tidak ada ambiguitas yang disebabkan, sistem mengembalikan kesalahan untuk memperingatkan Anda terhadap pernyataan ini. Kami sarankan Anda memodifikasi pernyataan yang relevan.

duplicated.partition.column

Partisi dengan nama yang sama ditentukan dalam query.

Dalam versi awal MaxCompute, tidak ada kesalahan yang dikembalikan jika dua kunci partisi dengan nama yang sama ditentukan. Kunci partisi terakhir menimpa kunci partisi sebelumnya. Ini menyebabkan kebingungan. MaxCompute V2.0 mengembalikan kesalahan dalam kasus ini. Contoh:

Sintaksis tidak valid 1:

insert overwrite table partition (ds = '1', ds = '2')select ... ;

ds = '1' diabaikan selama eksekusi.

Sintaksis valid:

insert overwrite table partition (ds = '2')select ... ;

Sintaksis tidak valid 2:

create table t (a bigint, ds string) partitioned by (ds string);

Sintaksis valid:

create table t (a bigint) partitioned by (ds string);

order.by.col.ambiguous

Klausa ORDER BY merujuk alias duplikat dalam klausa SELECT.

Sintaksis tidak valid:

select id, id
from table_test 
order by id;

Sintaksis valid:

select id, id id2
from table_name 
order by id;

Hapus alias duplikat sebelum klausa ORDER BY dapat merujuknya.

in.subquery.without.result

Jika colx dalam subquery tidak mengembalikan hasil, colx tidak ada di tabel sumber.

Sintaksis tidak valid:

select * from table_name
where not_exist_col in (select id from table_name limit 0);

Pesan kesalahan:

FAILED: ODPS-0130071:[2,7] Semantic analysis exception - column not_exist_col cannot be resolved

ctas.if.not.exists

Sintaksis tabel tujuan tidak valid.

Jika tabel tujuan ada, versi awal MaxCompute tidak memeriksa sintaksis. Namun, MaxCompute V2.0 memeriksa sintaksis. Akibatnya, sejumlah besar kesalahan mungkin dikembalikan. Contoh:

Sintaksis tidak valid:

create table if not exists table_name
as
select * from not_exist_table;

Pesan kesalahan:

FAILED: ODPS-0130131:[1,50] Table not found - table meta_dev.not_exist_table cannot be resolved

worker.restart.instance.timeout

Dalam versi awal MaxCompute, setiap kali UDF menghasilkan rekaman, operasi tulis dipicu pada Apsara Distributed File System, dan paket denyut jantung dikirim ke Job Scheduler. Jika UDF tidak menghasilkan rekaman selama 10 menit, kesalahan berikut dikembalikan:

FAILED: ODPS-0123144: Fuxi job failed - WorkerRestart errCode:252,errMsg:kInstanceMonitorTimeout, usually caused by bad udf performance.

Kerangka waktu proses MaxCompute V2.0 mendukung vectoring untuk memproses beberapa baris kolom sekaligus. Ini membuat eksekusi lebih efisien. Jika beberapa rekaman diproses sekaligus dan tidak ada paket denyut jantung yang dikirim ke Job Scheduler dalam periode tertentu, vectoring dapat menyebabkan pernyataan normal habis waktu. Interval antara dua rekaman keluaran tidak boleh melebihi 10 menit.

Jika kesalahan timeout terjadi, kami sarankan Anda pertama-tama memeriksa kinerja UDF. Diperlukan beberapa detik untuk memproses setiap rekaman. Jika UDF tidak dapat dioptimalkan, Anda dapat mengatur batch.rowcount secara manual untuk menangani masalah ini. Nilai default batch.rowcount adalah 1024.

set odps.sql.executionengine.batch.rowcount=16;

divide.nan.or.overflow

Versi awal MaxCompute tidak mendukung pelipatan konstan pembagian.

Kode berikut menunjukkan rencana eksekusi fisik dalam versi awal MaxCompute:

explain
select if(false, 0/0, 1.0)
from table_name;
in task M1_Stg1:
    Data source: meta_dev.table_name
    TS: alias: table_name
      SEL: If(False, Divide(UDFToDouble(0), UDFToDouble(0)), 1.0)
        FS: output: None

Fungsi IF dan DIVIDE dipertahankan. Selama eksekusi, parameter pertama IF diatur ke False, dan ekspresi DIVIDE tidak dievaluasi. Kesalahan pembagian dengan nol tidak terjadi.

Namun, MaxCompute V2.0 mendukung pelipatan konstan pembagian. Akibatnya, kesalahan dikembalikan. Contoh:

Sintaksis tidak valid:

select IF(FALSE, 0/0, 1.0)
from table_name;

Pesan kesalahan:

FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result NaN, two params are 0.000000 and 0.000000

Kesalahan overflow juga mungkin terjadi. Contoh:

Sintaksis tidak valid:

select if(false, 1/0, 1.0)
from table_name;

Pesan kesalahan:

FAILED: ODPS-0130071:[1,19] Semantic analysis exception - encounter runtime exception while evaluating function /, detailed message: DIVIDE func result overflow, two params are 1.000000 and 0.000000

Sintaksis valid:

Kami sarankan Anda menghapus /0 dan menggunakan konstanta yang valid.

Masalah serupa terjadi dalam pelipatan konstan untuk CASE WHEN, seperti CASE WHEN TRUE THEN 0 ELSE 0/0. Selama pelipatan konstan di MaxCompute V2.0, semua subekspresi dievaluasi, yang menyebabkan kesalahan pembagian dengan nol.

CASE WHEN mungkin melibatkan skenario optimasi yang lebih kompleks. Contoh:

select case when key = 0 then 0 else 1/key end
from (
select 0 as key from src
union all
select key from src) r;

Optimizer mendorong operasi pembagian ke subquery. Kode berikut menunjukkan konversi serupa:

M (
select case when 0 = 0 then 0 else 1/0 end c1 from src
UNION ALL
select case when key = 0 then 0 else 1/key end c1 from src) r;

Pesan kesalahan:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.ArithmeticException: DIVIDE func result overflow, two params are 1.000000 and 0.000000

Kesalahan dikembalikan untuk pelipatan konstan dalam klausa pertama UNION ALL. Kami sarankan Anda memindahkan CASE WHEN dalam pernyataan SQL ke subquery dan menghapus pernyataan CASE WHEN yang tidak berguna dan /0.

select c1 end
from (
select 0 c1 end from src
union all
select case when key = 0 then 0 else 1/key end) r;

small.table.exceeds.mem.limit

Versi awal MaxCompute mendukung optimasi multi-way join. Beberapa operasi JOIN dengan kunci join yang sama digabungkan untuk dieksekusi dalam tugas Fuxi yang sama, seperti J4_1_2_3_Stg1 dalam contoh ini.

explain
select t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;

Kode berikut menunjukkan rencana eksekusi fisik dalam versi awal MaxCompute:

In Job job0:
root Tasks: M1_Stg1, M2_Stg1, M3_Stg1
J4_1_2_3_Stg1 depends on: M1_Stg1, M2_Stg1, M3_Stg1

In Task M1_Stg1:
    Data source: meta_dev.t1

In Task M2_Stg1:
    Data source: meta_dev.t2

In Task M3_Stg1:
    Data source: meta_dev.t3

In Task J4_1_2_3_Stg1:
    JOIN: t1 INNER JOIN unknown INNER JOIN unknown
        SEL: t1._col0, t1._col1, t1._col2
            FS: output: None

Jika petunjuk MAPJOIN ditambahkan, rencana eksekusi fisik dalam versi awal MaxCompute tetap tidak berubah. Dalam versi awal MaxCompute, optimasi multi-way join diprioritaskan, dan petunjuk MAPJOIN yang ditentukan pengguna dapat diabaikan.

explain
select /* +mapjoin(t1) */ t1.*
from t1 join t2 on t1.c1 = t2.c1
join t3 on t1.c1 = t3.c1;

Rencana eksekusi fisik sebelumnya dalam versi awal MaxCompute diterapkan.

Optimizer MaxCompute V2.0 memprioritaskan petunjuk MAPJOIN yang ditentukan pengguna. Dalam contoh ini, jika t1 adalah tabel besar, kesalahan serupa dengan berikut ini mungkin dikembalikan:

FAILED: ODPS-0010000:System internal error - SQL Runtime Internal Error: Hash Join Cursor HashJoin_REL… small table exceeds, memory limit(MB) 640, fixed memory used …, variable memory used …

Dalam kasus ini, jika MAPJOIN tidak diperlukan, kami sarankan Anda menghapus petunjuk MAPJOIN.

sigkill.oom

sigkill.oom memiliki masalah yang sama dengan small.table.exceeds.mem.limit. Jika Anda menentukan petunjuk MAPJOIN dan ukuran tabel kecil besar, beberapa pernyataan JOIN mungkin dioptimalkan menggunakan multi-way join dalam versi awal MaxCompute. Akibatnya, pernyataan tersebut berhasil dieksekusi dalam versi awal MaxCompute. Namun, dalam MaxCompute V2.0, beberapa pengguna mungkin menggunakan odps.sql.mapjoin.memory.max untuk mencegah tabel kecil melebihi batas ukuran. Setiap pekerja MaxCompute memiliki batas memori. Jika ukuran tabel kecil besar, pekerja MaxCompute mungkin dihentikan karena batas memori terlampaui. Jika ini terjadi, kesalahan serupa dengan berikut ini dikembalikan:

Fuxi job failed - WorkerRestart errCode:9,errMsg:SigKill(OOM), usually caused by OOM(out of memory).

Kami sarankan Anda menghapus petunjuk MAPJOIN dan menggunakan multi-way join.

wm_concat.first.argument.const

Berdasarkan fungsi WM_CONCAT yang dijelaskan dalam Fungsi agregat, parameter pertama dari WM_CONCAT harus berupa konstanta. Namun, versi awal MaxCompute tidak memiliki standar pemeriksaan yang ketat. Misalnya, jika tabel sumber tidak memiliki data, tidak ada kesalahan yang dikembalikan meskipun parameter pertama WM_CONCAT adalah ColumnReference.

Deklarasi Fungsi:
string wm_concat(string separator, string str)
Parameter:
separator: pemisah, yang merupakan konstanta tipe STRING. Pemisah tipe lain atau pemisah non-konstan menyebabkan pengecualian. 

MaxCompute V2.0 memeriksa validitas parameter selama tahap perencanaan. Jika parameter pertama WM_CONCAT bukan konstanta, kesalahan dikembalikan. Contoh:

Sintaksis tidak valid:

select wm_concat(value, ',') FROM src group by value;

Pesan kesalahan:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.validator.AggregateCallValidator$AggregateCallValidationException: Invalid argument type - The first argument of WM_CONCAT must be constant string.

pt.implicit.convertion.failed

srcpt adalah tabel partisi yang memiliki dua partisi.

create table srcpt(key STRING, value STRING) partitioned by (pt STRING);
alter table srcpt add partition (pt='pt1');
alter table srcpt add partition (pt='pt2');

Dalam pernyataan SQL sebelumnya, konstanta tipe INT dalam kolom pt tipe STRING dikonversi menjadi tipe DOUBLE untuk perbandingan. Bahkan jika odps.sql.udf.strict.mode=true dikonfigurasi untuk proyek, versi awal MaxCompute tidak mengembalikan kesalahan dan menyaring semua kolom pt. Namun, dalam MaxCompute V2.0, kesalahan dikembalikan. Contoh:

Sintaksis tidak valid:

select key from srcpt where pt in (1, 2);

Pesan kesalahan:

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: java.lang.NumberFormatException: ODPS-0123091:Illegal type cast - In function cast, value 'pt1' cannot be casted from String to Double.

Kami sarankan Anda tidak membandingkan nilai dalam kolom kunci partisi tipe STRING dan konstanta INT. Jika perbandingan semacam itu diperlukan, konversikan konstanta INT menjadi tipe STRING.

having.use.select.alias

Spesifikasi SQL mendefinisikan bahwa klausa GROUP BY dan HAVING mendahului klausa SELECT. Oleh karena itu, alias kolom yang dihasilkan oleh klausa SELECT tidak dapat digunakan dalam klausa HAVING.

Contoh
  • Sintaksis tidak valid:
    select id id2 from table_name group by id having id2 > 0;
  • Pesan kesalahan:
    FAILED: ODPS-0130071:[1,44] Semantic analysis exception - column id2 cannot be resolvedODPS-0130071:[1,44] Semantic analysis exception - column reference id2 should appear in GROUP BY key

    id2 adalah alias kolom yang dihasilkan oleh klausa SELECT dan tidak dapat digunakan dalam klausa HAVING.

dynamic.pt.to.static

Dalam MaxCompute V2.0, partisi dinamis mungkin dikonversi menjadi partisi statis oleh optimizer.

Contoh
insert overwrite table srcpt partition(pt) select id, 'pt1' from table_name;

Pernyataan di atas dikonversi menjadi pernyataan berikut:

insert overwrite table srcpt partition(pt='pt1') select id from table_name;

Jika nilai partisi yang ditentukan tidak valid, seperti '${bizdate}', MaxCompute V2.0 mengembalikan kesalahan selama pemeriksaan sintaksis. Untuk informasi lebih lanjut, lihat Partisi.

Sintaksis tidak valid:

insert overwrite table srcpt partition(pt) select id, '${bizdate}' from table_name limit 0;

Pesan kesalahan:

FAILED: ODPS-0130071:[1,24] Semantic analysis exception - wrong columns count 2 in data source, requires 3 columns (includes dynamic partitions if any)

Dalam versi awal MaxCompute, tidak ada hasil yang dikembalikan oleh pernyataan SQL karena LIMIT 0, dan tidak ada partisi dinamis yang dibuat. Akibatnya, tidak ada kesalahan yang dikembalikan.

lot.not.in.subquery

Pemrosesan nilai NULL dalam subquery IN.

Dalam operasi IN SQL standar, jika daftar nilai berisi nilai NULL, nilai balik mungkin NULL atau true, tetapi tidak bisa false. Misalnya, 1 in (null, 1, 2, 3) mengembalikan true, 1 in (null, 2, 3) mengembalikan NULL, dan null in (null, 1, 2, 3) mengembalikan NULL. Demikian pula, untuk operasi NOT IN, jika daftar nilai berisi nilai NULL, nilai balik mungkin false atau NULL, tetapi tidak bisa true.

MaxCompute V2.0 memproses nilai NULL menggunakan aturan eksekusi standar. Jika Anda menerima notifikasi untuk masalah ini, periksa apakah subquery dalam operasi IN memiliki nilai NULL dan apakah eksekusi terkait sesuai dengan harapan Anda. Jika eksekusi terkait tidak sesuai dengan harapan Anda, modifikasi query.

Contoh
  • select * from t where c not in (select accepted from c_list);

    Jika kolom accepted tidak berisi nilai NULL, abaikan masalah ini. Jika kolom accepted berisi nilai NULL, c not in (select accepted from c_list) mengembalikan true dalam versi awal MaxCompute dan NULL dalam MaxCompute V2.0.

  • Sintaksis valid:
    select * from t where c not in (select accepted from c_list where accepted is not null)