Topik ini menjelaskan kemungkinan penyebab kode kesalahan ODPS-0130071: Semantic analysis exception dan menyediakan solusinya.
Pesan Kesalahan 1: jumlah kolom partisi input (n) tidak sama dengan kolom partisi tabel (m)
Contoh
FAILED: ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)
Deskripsi
Tabel tempat data dimasukkan merupakan tabel partisi yang memiliki m bidang partisi, tetapi hanya n (n < m) kolom kunci partisi yang ditentukan dalam pernyataan SQL untuk memasukkan data. Akibatnya, data gagal ditulis ke partisi tertentu dan kesalahan dikembalikan.
Solusi
Ubah pernyataan SQL agar kolom kunci partisi yang ditentukan sesuai dengan bidang partisi di tabel.
Contoh
-- Buat tabel.
CREATE TABLE if NOT EXISTS mf_sale_detail
(
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
partitioned BY
(
sale_date string,
region string
);
-- Kesalahan: Tabel target memiliki dua tingkat partisi, tetapi klausa PARTITION tidak ada atau tidak lengkap.
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: Tentukan semua partisi dalam klausa PARTITION.
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: Gunakan dynamic partitioning.
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');
OKPesan Kesalahan 2: diperlukan ekspresi kesetaraan (yaitu, hanya gunakan '=' dan 'AND') untuk kondisi join tanpa mapjoin hint
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Deskripsi
Dalam MaxCompute SQL, sort-merge join digunakan sebagai algoritma fisik untuk operasi join. Kondisi join harus mencakup ekspresi ekuivalen karena pengacakan dilakukan berdasarkan kolom dari tabel kiri dan kanan dalam ekspresi tersebut.
Solusi
Pastikan kondisi join berisi ekspresi ekuivalen.
Tambahkan map join hint.
CatatanJika kondisi ON hanya berisi ekspresi non-ekuivalen, sejumlah besar data dapat dihasilkan setelah operasi join, sehingga kueri memerlukan waktu lebih lama.
Contoh
-- Kesalahan: Kondisi join hanya berisi ekspresi non-kesetaraan.
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: Kondisi join mencakup ekspresi kesetaraan (t1.key = t2.key) yang melibatkan kolom dari kedua tabel.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key AND t1.value > t2.value;
-- Benar: Tambahkan mapjoin hint.
SELECT /*+mapjoin(t1)*/ t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;Pesan Kesalahan 3: insert into HASH CLUSTERED table/partition xxx saat ini tidak didukung
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported
Deskripsi
Pernyataan INSERT INTO tidak dapat digunakan untuk menulis data ke tabel terkluster.
Solusi
Ubah tabel menjadi tabel biasa.
Ubah pernyataan INSERT INTO menjadi pernyataan INSERT OVERWRITE.
Contoh
-- Buat tabel terkluster.
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;
-- Kesalahan: Menggunakan INSERT INTO dengan tabel terkluster.
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
-- Benar: Gunakan INSERT INTO dengan tabel biasa.
CREATE TABLE sale_detail
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
);
INSERT INTO sale_detail
VALUES ('a', 123, 'id123');
-- Benar: Gunakan INSERT OVERWRITE dengan tabel terkluster.
INSERT overwrite TABLE sale_detail_hashcluster
VALUES ('a', 123, 'id123');Pesan Kesalahan 4: harus muncul dalam kunci GROUP BY
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key
Deskripsi
Klausa GROUP BY mengagregasi data dalam tabel input berdasarkan kunci yang ditentukan. Setelah operasi agregasi dilakukan, berlaku ketentuan berikut:
Untuk kolom yang sesuai dengan kunci agregasi, Anda dapat langsung memperoleh nilai output atau memanggil fungsi umum (non-agregat) untuk memproses dan menghitung lebih lanjut data dalam kolom tersebut.
Untuk kolom yang tidak sesuai dengan kunci agregasi, Anda tidak dapat langsung memperoleh nilai output dan harus memanggil fungsi agregat seperti SUM, COUNT, atau AVG untuk menghitung hasil agregasi.
Solusi
Untuk kolom yang tidak sesuai dengan kunci agregasi, panggil fungsi agregat seperti SUM, COUNT, AVG, atau ANY_VALUE untuk menghitung hasil agregasi.
Contoh pernyataan kueri
-- Kesalahan: Kolom `c` tidak ada dalam kunci GROUP BY dan tidak digunakan dalam fungsi agregat.
SELECT a, sum(b), c
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
-- Pesan kesalahan dikembalikan.
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - column reference t.c should appear in GROUP BY key
-- Benar: Gunakan fungsi agregat any_value() pada kolom `c`.
SELECT a, sum(b), any_value(c)
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;Pesan Kesalahan 5: Nilai partisi tidak valid
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'
Deskripsi
Nilai bidang partisi tidak valid. Nilai bidang partisi dalam tabel MaxCompute harus mematuhi aturan berikut:
Nilai bidang partisi tidak boleh mengandung karakter double-byte seperti karakter Tionghoa. Panjangnya harus antara 1 hingga 128 byte, terdiri atas huruf, angka, serta karakter khusus yang didukung, dan harus dimulai dengan huruf.
Karakter yang diizinkan mencakup spasi, titik dua (:), garis bawah (_), tanda dolar ($), tanda pagar (#), titik (.), tanda seru (!), dan tanda at (@). Perilaku karakter lain, seperti karakter escape
\t,\n, dan/, tidak terdefinisi.
Solusi
Ubah nilai bidang partisi menjadi nilai yang valid.
Contoh pernyataan kueri
-- Buat tabel.
CREATE TABLE mc_test
(
a bigint
)
partitioned BY
(
ds string
);
-- Kesalahan: Nilai partisi '${today}' tidak valid.
ALTER TABLE mc_test ADD PARTITION(ds = '${today}');
-- Pesan kesalahan dikembalikan.
FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'
-- Benar: Ubah nilai partisi menjadi nilai yang valid, misalnya '20221206'.
ALTER TABLE mc_test ADD PARTITION(ds='20221206');Pesan Kesalahan 6: hanya tabel eksternal OSS yang mendukung sintaks msck repair
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax
Deskripsi
Hanya tabel eksternal Object Storage Service (OSS) yang mendukung pernyataan MSCK REPAIR TABLE. Untuk informasi selengkapnya, lihat Tabel eksternal ORC.
Metode 1 (Direkomendasikan): Temukan dan tambahkan partisi secara otomatis.
Dengan metode ini, MaxCompute secara otomatis menambahkan partisi yang hilang ke tabel eksternal OSS berdasarkan struktur direktori di OSS. Metode ini berguna untuk mengisi kembali sejumlah besar partisi historis sekaligus.
msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];Catatan
Metode ini tidak cocok untuk menambahkan partisi inkremental, terutama ketika direktori OSS berisi banyak partisi (misalnya, lebih dari 1.000). Hal ini karena ketika jumlah partisi baru jauh lebih kecil daripada jumlah partisi yang sudah ada, menjalankan perintah
mscksecara berulang mengakibatkan banyak pemindaian berulang pada direktori OSS dan permintaan pembaruan metadata, sehingga secara signifikan mengurangi efisiensi eksekusi perintah. Oleh karena itu, untuk skenario yang memerlukan penambahan partisi inkremental, kami merekomendasikan Metode 2.Metode 2: Tambahkan partisi secara manual.
Metode ini direkomendasikan untuk menambahkan partisi baru secara berkala setelah partisi historis awal dimuat. Buat partisi baru sebelum menjalankan pekerjaan penulisan data Anda. Setelah partisi dibuat, tabel eksternal dapat membaca data terbaru dari direktori OSS yang sesuai tanpa perlu merefresh partisi.
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 direktori file data partisi. Misalnya, asumsikan struktur direktori OSS berikut: col_name bersesuaian dengan
direction, dan col_value bersesuaian denganN, NE, S, SW, W. Satu pernyataanadd partitionbersesuaian dengan satu subdirektori, dan beberapa subdirektori OSS memerlukan beberapa pernyataanadd partition.
Contoh
Buat direktori bernama
demo8di OSS. Kemudian, buat dua folder partisi di direktori tersebut dan letakkan file yang sesuai di dalamnya.Folder partisi:
$pt1=1/$pt2=2. Nama file:demo8-pt1.txt.Folder partisi:
$pt1=3/$pt2=4. Nama file:demo8-pt2.txt.
Buat tabel eksternal dan tentukan bidang
pt.Jika nama kolom partisi dalam tabel eksternal OSS tidak sesuai dengan struktur direktori OSS, tentukan direktorinya.
--Buat tabel eksternal
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/";
--Tentukan bidang partisi
MSCK REPAIR TABLE mf_oss_spe_pt ADD PARTITIONS
with PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
--Kueri data
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 |
+------------+------------+------------+------------+
--Kueri data
select * from mf_oss_spe_pt where pt1=3 and pt2=4;
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 3 | john | 3 | 4 |
| 4 | lily | 3 | 4 |
+------------+------------+------------+------------+--Pemetaan antara partisi MaxCompute dan direktori OSS adalah sebagai berikut:
--pt1=8-->8
--pt2=8-->$pt2=8
--Tambahkan partisi
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 dan masukkan data
set odps.sql.unstructured.oss.commit.mode=false;
insert into mf_oss_spe_pt partition (pt1=8,pt2=8) values (1,'tere');
--Kueri data
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 |
+------+------+-----+-----+Solusi
Anda harus membuat tabel eksternal OSS seperti yang dijelaskan dalam dokumentasi sebelum dapat menjalankan perintah MSCK REPAIR.
Contoh pernyataan kueri
--Buat tabel biasa
CREATE TABLE mc_test
(
a BIGINT
)
partitioned BY
(
ds string
);
--Kesalahan. Tabel biasa tidak dapat melakukan operasi msck repair.
msck TABLE mc_test ADD partitions;
FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax
Pesan Kesalahan 7: kolom xx di sumber memiliki tipe yy yang tidak kompatibel dengan kolom tujuan zz, yang memiliki tipe ttt
Contoh
ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt
Deskripsi
Saat data dimasukkan ke tabel, tipe data tabel tujuan harus sesuai dengan tipe data data yang dimasukkan, atau tipe data data yang dimasukkan dapat dikonversi secara implisit ke tipe data tabel tujuan. Jika tidak, kesalahan akan dikembalikan.
Solusi
Ubah pernyataan kueri agar tipe data data yang dimasukkan sesuai dengan tipe data tabel tujuan.
Contoh pernyataan kueri
-- Buat tabel.
odps> CREATE TABLE mc_test
(
a datetime
);
-- Kesalahan: Tipe data tidak kompatibel.
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 data dengan tipe yang benar.
odps> INSERT overwrite TABLE mc_test
VALUES (datetime '2022-12-06 14:23:45');Pesan Kesalahan 8: fungsi datediff tidak cocok dengan fungsi overloaded apa pun dengan (STRING, STRING, STRING), kandidatnya adalah 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)
Contoh
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)
Deskripsi
Tipe data parameter input fungsi DATEDIFF tidak sesuai. Masalah ketidaksesuaian tipe umum terjadi karena konversi tipe data implisit tidak diizinkan setelah edisi tipe data MaxCompute V2.0 diaktifkan.
Solusi
Gunakan salah satu metode berikut:
Tambahkan
set odps.sql.type.system.odps2=false;sebelum kueri SQL dan jalankan bersama-sama. Ini menonaktifkan tipe data 2.0 dan mengaktifkan konversi tipe implisit.Ubah tipe data parameter input.
Pesan Kesalahan 9: Role tidak ada: acs:ram::xxxxxx:role/aliyunodpsdefaultrole
Contoh
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"}
Deskripsi
Saat membuat tabel eksternal OSS, Anda perlu menentukan peran RAM yang digunakan untuk mengakses OSS. Dalam kasus ini, peran RAM yang tidak ada digunakan, sehingga otentikasi peran gagal.
Solusi
Ubah nilai parameter odps.properties.rolearn. Format Nama Sumber Daya Alibaba Cloud (ARN) adalah acs:ram::<UID>:role/<Role>.
Perhatikan informasi berikut:
UID: angka 16 digit.
Role: nama peran yang dikonfigurasi di Konsol Resource Access Management (RAM).
Contoh
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'
Untuk mendapatkan ARN, buka halaman Roles. Di halaman tersebut, klik nama peran untuk melihat detailnya.
Di Konsol RAM, pada halaman Identity Management > Roles, temukan peran AliyunPAIAccessingOSSRole dalam daftar peran.
Di halaman detail peran, pada bagian Informasi Dasar, temukan bidang ARN. Klik tombol salin di sebelah kanannya untuk mendapatkan nilai ARN.
Pesan Kesalahan 10: terjadi runtime exception saat mengevaluasi fungsi MAX_PT
Contoh
FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null
Deskripsi
Saat pernyataan SQL dieksekusi, partisi yang ditentukan oleh max_pt berubah, sehingga kesalahan dikembalikan akibat inkonsistensi data.
Solusi
Jangan mengeksekusi pernyataan SQL yang menentukan max_pt untuk partisi baru.
Aktifkan sistem untuk menjalankan ulang tugas konfigurasi jika kesalahan dilaporkan untuk tugas tersebut.
Pesan Kesalahan 11: kolom xxx tidak dapat diselesaikan
Contoh
ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved
Deskripsi
Kolom xxx tidak ada di tabel.
Solusi
Periksa skrip SQL dan perbarui xxx menjadi nama kolom yang valid.
Pesan Kesalahan 12: fungsi evaluate dalam kelas XX untuk user defined function YY tidak sesuai dengan anotasi ZZ
Contoh
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
Deskripsi
Kode user-defined function (UDF) Java atau Python tidak memenuhi standar penulisan UDF. Informasi dalam anotasi signature fungsi tidak sesuai dengan informasi dalam kode.
Solusi
Ubah kode UDF agar informasi dalam anotasi signature fungsi sesuai dengan informasi dalam kode.
Contoh pernyataan kueri
-- Berikut adalah contoh UDF Python yang salah. Implementasinya memiliki dua parameter input, tetapi anotasinya hanya menentukan satu.
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
-- Berikut adalah contoh lain UDF Python yang salah. Fungsi 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
-- Berikut adalah UDF Python yang benar.
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 + arg1Pesan Kesalahan 13: Daftar putih VPC: , ID VPC: vpc-xxxx tidak diizinkan untuk mengakses
Contoh
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.=
Deskripsi
Saat mengakses layanan di VPC menggunakan tabel eksternal, pesan kesalahan muncul karena konfigurasi VPC tidak valid.
Solusi
Konfigurasikan daftar putih alamat IP di VPC dan pastikan MaxCompute dapat mengakses layanan di VPC dari alamat IP dalam daftar putih tersebut. Untuk informasi selengkapnya, lihat bagian "Akses melalui VPC (koneksi khusus)" dalam Proses koneksi jaringan.
Pesan Kesalahan 14: Semantic analysis exception - physical plan generation failed
Contoh
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.
Deskripsi
Saat mengakses layanan Alibaba Cloud, peran terkait layanan (SLR) yang terkait dengan layanan tersebut belum ditetapkan ke Akun Alibaba Cloud Anda, sehingga Anda tidak dapat mengakses data layanan tersebut menggunakan SLR.
Solusi
Klik di sini untuk menetapkan SLR ke Akun Alibaba Cloud Anda.