All Products
Search
Document Center

MaxCompute:ODPS-0130071: Pengecualian analisis semantik

Last Updated:Mar 26, 2026

Setiap sub-kesalahan berikut dipetakan ke pesan ODPS-0130071 tertentu. Temukan pesan yang sesuai dengan output kesalahan Anda, lalu ikuti solusinya.

Kesalahan 1: Jumlah kolom partisi tidak cocok

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)

Tabel tujuan memiliki m kolom partisi, tetapi pernyataan INSERT hanya menentukan n kolom (dengan n < m). Tentukan semua kolom partisi—baik dengan nilai statis maupun menggunakan partisi dinamis.

Contoh

-- Definisi tabel: dua kolom partisi (sale_date, region)
create table if not exists mf_sale_detail
(
  shop_name     string,
  customer_id   string,
  total_price   double
)
partitioned by
(
  sale_date string,
  region    string
);

-- Salah: tidak ada klausa partisi yang ditentukan
insert overwrite table mf_sale_detail
    values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
FAILED: ODPS-0130071:[1,24] Semantic analysis exception - the number of input partition columns (0) doesn't equal to table's partition columns (2)

-- Benar: semua kolom partisi ditentukan dengan nilai statis
insert overwrite table mf_sale_detail partition(sale_date = '2013', region = 'china')
    values ('s1', 'c1', 100.1), ('s2', 'c2', 100.2), ('s3', 'c3', 100.3);
OK

-- Benar: partisi dinamis (nilai region berasal dari data)
insert overwrite table mf_sale_detail partition(sale_date = '2013', region)
    values ('s1', 'c1', 100.1, 'china'), ('s2', 'c2', 100.2, 'china'), ('s3', 'c3', 100.3, 'china');
OK

Kesalahan 2: Kondisi JOIN non-equi tanpa petunjuk map join

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint

SQL MaxCompute menggunakan algoritma JOIN sort-merge secara fisik. Sort-merge join memerlukan setidaknya satu ekspresi kesetaraan (=) dalam klausa ON—kolom kesetaraan ini digunakan untuk melakukan pengacakan data antara tabel kiri dan kanan. Kondisi yang hanya berisi non-equi (misalnya, t1.value > t2.value) tidak memiliki ekspresi kesetaraan untuk pengacakan, sehingga kueri gagal.

Perbaiki masalah ini dengan salah satu dari dua pendekatan berikut:

  • Tambahkan ekspresi kesetaraan ke klausa ON. Predikat non-equi dapat tetap sebagai filter tambahan.

  • **Tambahkan petunjuk /*+mapjoin(t1)*/.** Map join menyiarkan tabel yang lebih kecil ke semua worker dan memungkinkan kondisi non-equi. Gunakan ini hanya jika tabel yang disiarkan berukuran kecil—JOIN non-equi tanpa kolom kesetaraan dapat menghasilkan set hasil yang sangat besar dan memperlambat kueri secara signifikan.

Contoh

-- Salah: klausa ON hanya berisi ekspresi non-equi
odps>select t1. *
from src t1
join src t2
on t1.value > t2.value;

FAILED: ODPS-0130071:[4,4] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint

-- Benar: ekspresi kesetaraan ditambahkan; predikat non-equi tetap sebagai filter tambahan
odps>select t1. *
from src t1
join src t2
on t1.key = t2.key and t1.value > t2.value;

-- Benar: petunjuk map join ditambahkan (menyiarkan t1 ke semua worker)
odps>select /*+mapjoin(t1)*/ t1. *
from src t1
join src t2
on t1.value > t2.value;

Kesalahan 3: INSERT INTO tidak didukung pada tabel HASH CLUSTERED

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported

INSERT INTO tidak dapat menulis data ke tabel HASH CLUSTERED. Gunakan salah satu pendekatan berikut:

  • Beralih ke INSERT OVERWRITE pada tabel terkluster.

  • Menulis ke tabel non-terkluster.

Contoh

-- Membuat tabel terkluster
odps>create table sale_detail_hashcluster
(
  shop_name   STRING,
  total_price decimal,
  customer_id BIGINT
)
clustered by(customer_id)
sorted by(customer_id)
into 1024 buckets;

-- Salah: INSERT INTO pada tabel terkluster
odps>insert into sale_detail_hashcluster
values ('a', 123, 'id123');

FAILED: ODPS-0130071:[1,13] Semantic analysis exception - insert into HASH CLUSTERED table/partition meta.sale_detail_hashcluster is not current supported

-- Opsi benar 1: menulis ke tabel non-terkluster
odps>create table sale_detail
(
  shop_name   STRING,
  total_price decimal,
  customer_id BIGINT
);

odps>insert into sale_detail
values ('a', 123, 'id123');

-- Opsi benar 2: gunakan INSERT OVERWRITE pada tabel terkluster
odps>insert overwrite table sale_detail_hashcluster
values ('a', 123, 'id123');

Kesalahan 4: Kolom tidak ada dalam kunci GROUP BY

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key

Setelah agregasi GROUP BY, hanya dua jenis kolom yang dapat muncul dalam daftar SELECT:

  • Kolom yang tercantum dalam klausa GROUP BY—ditampilkan langsung atau dilewatkan melalui fungsi non-agregasi.

  • Kolom yang tidak ada dalam klausa GROUP BY—harus dibungkus dalam fungsi agregasi seperti SUM, COUNT, AVG, atau ANY_VALUE.

Terapkan fungsi agregasi pada setiap kolom yang bukan bagian dari kunci GROUP BY. Gunakan ANY_VALUE jika Anda memerlukan satu nilai dari grup tetapi tidak peduli baris mana asal nilainya.

Contoh

-- Salah: kolom c tidak ada dalam GROUP BY dan tidak memiliki fungsi agregasi
odps> select a, sum(b), c
from values (1L, 2L, 3L) as t(a, b, c)
group by a;

FAILED: ODPS-0130071:[1,19] Semantic analysis exception - column reference t.c should appear in GROUP BY key

-- Benar: ANY_VALUE memilih satu nilai c dari setiap grup
odps> select a, sum(b), any_value(c)
from values (1L, 2L, 3L) as t(a, b, c)
group by a;

Kesalahan 5: Nilai partisi tidak valid

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'

Nilai partisi tidak memenuhi persyaratan MaxCompute. Nilai partisi yang valid harus:

  • Berukuran 1 hingga 128 byte

  • Diawali dengan huruf

  • Hanya berisi huruf, angka, atau karakter khusus berikut: spasi, :, _, $, #, ., !, @

  • Tidak mengandung karakter double-byte seperti karakter Tionghoa

Karakter seperti \t, \n, dan / memiliki perilaku tidak terdefinisi dan sebaiknya tidak digunakan.

Ubah nilai partisi menjadi nilai yang memenuhi aturan ini.

Contoh

-- Tabel dengan kolom partisi
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- Salah: '${today}' tidak valid untuk field partisi
odps> alter table mc_test add partition(ds = '${today}');

FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'

-- Benar: gunakan string tanggal biasa
odps> alter table mc_test add partition(ds='20221206');

Kesalahan 6: MSCK REPAIR TABLE digunakan pada tabel eksternal non-OSS

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax

MSCK REPAIR TABLE hanya berfungsi dengan tabel eksternal Object Storage Service (OSS). Menjalankannya pada tabel MaxCompute biasa menyebabkan kesalahan ini.

Buat tabel eksternal OSS terlebih dahulu, lalu jalankan MSCK REPAIR TABLE terhadap tabel tersebut. Untuk detail tentang pembuatan tabel eksternal OSS, lihat Buat tabel eksternal OSS.

Menambahkan partisi ke tabel eksternal OSS

Dua metode tersedia untuk mendaftarkan partisi setelah tabel dibuat.

Metode 1 (direkomendasikan untuk pendaftaran massal satu kali): Biarkan MaxCompute mendeteksi struktur direktori OSS secara otomatis dan mendaftarkan semua partisi yang sesuai sekaligus.

msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];
Metode ini memindai seluruh direktori OSS setiap kali dijalankan. Hindari penggunaannya untuk direktori dengan lebih dari 1.000 partisi atau ketika partisi baru sering ditambahkan—pemindaian penuh berulang menghasilkan banyak permintaan pembaruan metadata dan mengurangi efisiensi. Gunakan Metode 2 dalam kasus tersebut.

Metode 2 (direkomendasikan untuk pendaftaran partisi inkremental): Tambahkan partisi satu per satu menggunakan ALTER TABLE. Gunakan metode ini ketika partisi ditambahkan secara berkala.

ALTER TABLE <mc_oss_extable_name>
    ADD PARTITION (<col_name>=<col_value>)[
ADD PARTITION (<col_name>=<col_value>)...][location URL];

Nilai col_name dan col_value harus sesuai dengan nama subdirektori OSS tempat data partisi disimpan. Tambahkan satu klausa ADD PARTITION untuk setiap subdirektori OSS.Partition path

Contoh lengkap dengan MSCK REPAIR TABLE

Contoh berikut membuat tabel eksternal OSS dengan dua kolom partisi (pt1, pt2) dan menggunakan MSCK REPAIR TABLE untuk mendaftarkan partisi yang nama direktori OSS-nya berbeda dari nama kolom.

  1. Buat struktur direktori OSS:

    • demo8/$pt1=1/$pt2=2/demo8-pt1.txt

    • demo8/$pt1=3/$pt2=4/demo8-pt2.txt

  2. Buat tabel eksternal dan daftarkan partisi:

    -- Buat tabel eksternal OSS
    CREATE EXTERNAL TABLE mf_oss_spe_pt (id int, name string)
    partitioned BY (pt1 string, pt2 string)
    stored AS TEXTFILE
    location "oss://oss-cn-beijing-internal.aliyuncs.com/mfoss*******/demo8/";
    
    -- Daftarkan partisi; petakan nama kolom MaxCompute ke awalan direktori OSS
    MSCK REPAIR TABLE  mf_oss_spe_pt ADD PARTITIONS
    WITH PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
    
    -- Kueri data dari partisi yang terdaftar
    SELECT * FROM mf_oss_spe_pt WHERE pt1=1 AND pt2=2;
    -- Hasil:
    +------------+------------+------------+------------+
    | id         | name       | pt1        | pt2        |
    +------------+------------+------------+------------+
    | 1          | kyle       | 1          | 2          |
    | 2          | nicole     | 1          | 2          |
    +------------+------------+------------+------------+
    
    SELECT * FROM mf_oss_spe_pt WHERE pt1=3 AND pt2=4;
    +------------+------------+------------+------------+
    | id         | name       | pt1        | pt2        |
    +------------+------------+------------+------------+
    | 3          | john       | 3          | 4          |
    | 4          | lily       | 3          | 4          |
    +------------+------------+------------+------------+
  3. Jika nama kolom MaxCompute tidak sesuai dengan nama direktori OSS, tentukan path OSS secara eksplisit menggunakan ALTER TABLE:

    -- Pemetaan: pt1=8 dipetakan ke direktori OSS 8; pt2=8 dipetakan ke direktori OSS $pt2=8
    ALTER TABLE mf_oss_spe_pt ADD PARTITION (pt1=8,pt2=8)
          location 'oss://oss-cn-beijing-internal.aliyuncs.com/mfosscostfee/demo8/8/$pt2=8/';
    
    -- Nonaktifkan mode commit, lalu masukkan dan kueri
    SET odps.sql.unstructured.oss.commit.mode=false;
    INSERT INTO mf_oss_spe_pt PARTITION (pt1=8,pt2=8) VALUES (1,'tere');
    
    SET odps.sql.unstructured.oss.commit.mode=false;
    SELECT * FROM mf_oss_spe_pt WHERE pt1=8 AND pt2=8;
    +------+------+-----+-----+
    | id   | name | pt1 | pt2 |
    +------+------+-----+-----+
    | 1    | tere | 8   | 8   |
    +------+------+-----+-----+

Contoh kesalahan

-- Tabel MaxCompute biasa (bukan tabel eksternal OSS)
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- Salah: MSCK REPAIR TABLE tidak berfungsi pada tabel biasa
odps> msck table mc_test add partitions;

FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax

Kesalahan 7: Tipe data tidak kompatibel pada INSERT

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt

Tipe data nilai yang dimasukkan tidak sesuai dengan tipe kolom tujuan dan tidak dapat dikonversi secara implisit. Ubah pernyataan INSERT agar tipe nilai yang dimasukkan sesuai dengan tipe kolom tujuan.

Contoh

-- Tabel dengan kolom DATETIME
odps> create table mc_test
(
  a datetime
);

-- Salah: memasukkan nilai BIGINT ke kolom DATETIME
odps> insert overwrite table mc_test
values (1L);

FAILED: ODPS-0130071:[2,9] Semantic analysis exception - column __value_col0 in source has incompatible type BIGINT with destination column a, which has type DATETIME

-- Benar: masukkan literal DATETIME
odps> insert overwrite table mc_test
values (datetime '2022-12-06 14:23:45');

Kesalahan 8: Ketidakcocokan tipe parameter DATEDIFF

Pesan kesalahan

ODPS-0130071:[m,n] Semantic analysis exception - function datediff cannot match any overloaded functions with (STRING, STRING, STRING), candidates are BIGINT DATEDIFF(DATE arg0, DATE arg1, STRING arg2); BIGINT DATEDIFF(DATETIME arg0, DATETIME arg1, STRING arg2); BIGINT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1, STRING arg2); INT DATEDIFF(DATE arg0, DATE arg1); INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)

Tipe argumen yang diberikan ke DATEDIFF tidak sesuai dengan salah satu tanda tangan yang didukung. Hal ini umum terjadi ketika edisi tipe data MaxCompute V2.0 diaktifkan, karena V2.0 menonaktifkan konversi implisit antar tipe.

DATEDIFF menerima tanda tangan berikut:

Tipe kembalianTanda tangan
BIGINTDATEDIFF(DATE, DATE, STRING)
BIGINTDATEDIFF(DATETIME, DATETIME, STRING)
BIGINTDATEDIFF(TIMESTAMP, TIMESTAMP, STRING)
INTDATEDIFF(DATE, DATE)
INTDATEDIFF(STRING, STRING)
INTDATEDIFF(TIMESTAMP, TIMESTAMP)

Perbaiki masalah ini dengan salah satu dari dua pendekatan berikut:

  • Ubah tipe argumen menjadi tipe yang sesuai dengan salah satu tanda tangan di atas.

  • Nonaktifkan edisi tipe data V2.0 dengan menambahkan set odps.sql.type.system.odps2=false; sebelum pernyataan SQL Anda dan kirimkan keduanya bersamaan. Ini akan mengaktifkan kembali konversi implisit.

Kesalahan 9: Peran RAM tidak ditemukan untuk tabel eksternal OSS

Pesan kesalahan

ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: java.lang.RuntimeException: {"RequestId":"A7BFAD2F-8982-547A-AB5E-93DAF5061FBD","HostId":"sts.aliyuncs.com","Code":"EntityNotExist.Role","Message":"The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole. ","Recommend":"https://next.api.aliyun.com/troubleshoot?q=EntityNotExist.Role&product=Sts"}

Peran RAM yang ditentukan dalam odps.properties.rolearn tidak ada, sehingga otentikasi peran gagal saat MaxCompute mencoba mengakses Object Storage Service (OSS).

Tetapkan odps.properties.rolearn ke Nama Sumber Daya Alibaba Cloud (ARN) yang benar dari peran RAM yang ada. Format ARN adalah:

acs:ram::<UID>:role/<Role>
  • UID: ID akun Alibaba Cloud 16 digit Anda

  • Role: nama peran sebagaimana dikonfigurasi di Konsol Resource Access Management (RAM)

Contoh

'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'

Untuk menemukan ARN, buka Konsol RAM, buka halaman Roles, lalu klik nama peran untuk melihat ARN-nya.

imageimage

Kesalahan 10: Pengecualian waktu proses MAX_PT

Pesan kesalahan

FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null

Partisi yang diselesaikan oleh MAX_PT berubah antara perencanaan kueri dan eksekusi, menyebabkan kesalahan inkonsistensi data.

Dua solusi tersedia:

  • Jangan mengeksekusi pernyataan SQL yang menentukan MAX_PT untuk partisi baru.

  • Jika kesalahan ini muncul dalam tugas konfigurasi, konfigurasikan tugas agar mencoba ulang secara otomatis saat gagal.

Kesalahan 11: Kolom tidak dapat diselesaikan

Pesan kesalahan

ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved

Kolom xxx tidak ada di tabel yang dirujuk. Periksa skrip SQL Anda dan ganti xxx dengan nama kolom yang valid.

Kesalahan 12: Fungsi evaluate UDF tidak sesuai dengan anotasi

Pesan kesalahan

FAILED: ODPS-0130071:[1,8] Semantic analysis exception - evaluate function in class test.MyPlus for user defined function my_plus does not match annotation bigint->bigint

Decorator @annotate pada kelas user-defined function (UDF) mendeklarasikan tanda tangan yang berbeda dari parameter aktual metode evaluate. Perbarui kode UDF agar anotasi dan tanda tangan metode sesuai.

Kesalahan umum dalam UDF Python:

  • Anotasi mendeklarasikan satu parameter input, tetapi evaluate menerima dua argumen (ditambah self).

  • Metode evaluate tidak memiliki parameter self.

Contoh

-- Salah: anotasi menyatakan satu input (bigint->bigint), tetapi evaluate menerima dua argumen
from odps.udf import annotate
@annotate("bigint->bigint")
class MyPlus(object):
   def evaluate(self, arg0, arg1):
       if None in (arg0, arg1):
           return None
       return arg0 + arg1

-- Salah: evaluate tidak memiliki parameter self
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
   def evaluate(arg0, arg1):
       if None in (arg0, arg1):
           return None
       return arg0 + arg1

-- Benar: anotasi sesuai dengan tanda tangan evaluate; self ada
from odps.udf import annotate
@annotate("bigint,bigint->bigint")
class MyPlus(object):
   def evaluate(self, arg0, arg1):
       if None in (arg0, arg1):
           return None
       return arg0 + arg1

Kesalahan 13: VPC tidak ada dalam daftar putih untuk akses tabel eksternal

Pesan kesalahan

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.lot.cbo.plan.splitting.impl.vpc.AliHyperVpcRuntimeException: Vpc white list: , Vpc id: vpc-xxxx is not allowed to access. Contact project owner to set allowed accessed vpc id list.=

MaxCompute tidak dapat mengakses layanan berbasis VPC melalui tabel eksternal karena VPC tersebut tidak ada dalam daftar izin. Tambahkan VPC ke daftar putih alamat IP dan pastikan MaxCompute dapat mengakses layanan tersebut dari alamat IP yang diizinkan. Untuk langkah-langkah konfigurasi, lihat bagian "Akses melalui VPC (koneksi khusus)" dalam Proses koneksi jaringan.

Kesalahan 14: Pembuatan rencana fisik gagal — peran terkait layanan belum ditetapkan

Pesan kesalahan

FAILED: ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: com.aliyun.odps.common.table.na.NativeException: kNotFound:The role_arn you provide not exists in HOLO auth service. Please check carefully.

Peran terkait layanan (SLR) yang digunakan MaxCompute untuk mengakses layanan Alibaba Cloud target belum ditetapkan ke akun Anda. Klik Otorisasi Cepat RAM untuk menetapkan SLR ke akun Anda.