Bu konu, ODPS-0130071: Semantic analysis exception hata kodunun olası nedenlerini açıklar ve çözüm önerileri sunar.
Hata Mesajı 1: the number of input partition columns (n) doesn't equal to table's partition columns (m)
Örnek
FAILED: ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)
Açıklama
Veri eklenen tablo bölümlenmiş bir tablodur. Tabloda m adet bölüm alanı bulunurken, veriyi eklemek için çalıştırılan SQL ifadesinde n (n < m) adet bölüm anahtarı sütunu belirtilmiştir. Bu durum, verilerin belirli bir bölüme yazılamamasına ve hata alınmasına neden olur.
Çözümler
SQL ifadesini, ifadede belirtilen bölüm anahtarı sütunlarının tablodaki bölüm alanlarıyla eşleşmesini sağlayacak şekilde değiştirin.
Örnekler
-- Create a table.
CREATE TABLE if NOT EXISTS mf_sale_detail
(
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
partitioned BY
(
sale_date string,
region string
);
-- Error: The target table has two partition levels, but the PARTITION clause is either missing or incomplete.
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)
-- Correct: Specify all partitions in the PARTITION clause.
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
-- Correct: Use 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');
OK
Hata Mesajı 2: expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
Açıklama
MaxCompute SQL'de birleştirme işlemleri için fiziksel algoritma olarak sort-merge join kullanılır. Birleştirme koşulu mutlaka bir eşitlik ifadesi içermelidir. Gerçek sorgu işlemlerinde, eşitlik ifadesindeki sol ve sağ tabloların sütunlarına göre karıştırma (shuffling) işlemi gerçekleştirilir.
Çözümler
Birleştirme koşulunun bir eşitlik ifadesi içerdiğinden emin olun.
-
Map join ipucu ekleyin.
NotON koşulu yalnızca eşitsizlik ifadesi içeriyorsa, birleştirme işleminden sonra büyük miktarda veri oluşabilir. Bu durum, sorgu işleminin daha uzun sürmesine neden olur.
Örnekler
-- Error: The join condition contains only a non-equality expression.
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
-- Correct: The join condition includes an equality expression (t1.key = t2.key) involving columns from both tables.
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key AND t1.value > t2.value;
-- Correct: Add a mapjoin hint.
SELECT /*+mapjoin(t1)*/ t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
Hata Mesajı 3: insert into HASH CLUSTERED table/partition xxx is not current supported
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported
Açıklama
INSERT INTO ifadesi kullanılarak kümelenmiş bir tabloya veri yazılamaz.
Çözümler
Tabloyu normal bir tabloya dönüştürün.
INSERT INTO ifadesini INSERT OVERWRITE ifadesiyle değiştirin.
Örnekler
-- Create a clustered table.
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;
-- Error: Using INSERT INTO with a clustered table.
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
-- Correct: Use INSERT INTO with a common table.
CREATE TABLE sale_detail
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
);
INSERT INTO sale_detail
VALUES ('a', 123, 'id123');
-- Correct: Use INSERT OVERWRITE with the clustered table.
INSERT overwrite TABLE sale_detail_hashcluster
VALUES ('a', 123, 'id123');
Hata Mesajı 4: should appear in GROUP BY key
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key
Açıklama
GROUP BY yan tümcesi, girdi tablosundaki verileri belirtilen anahtara göre gruplar. Gruplama işlemi tamamlandıktan sonra aşağıdaki sonuçlar elde edilir:
Gruplama anahtarına karşılık gelen sütun için çıkış değerleri doğrudan alınabilir. Ayrıca, sütundaki verileri daha fazla işlemek ve hesaplamak amacıyla yaygın işlevler (gruplama dışı işlevler) çağrılabilir.
Gruplama anahtarına karşılık gelmeyen sütunlar için çıkış değerleri doğrudan alınamaz. Gruplama sonuçlarını hesaplamak üzere SUM, COUNT ve AVG gibi gruplama işlevlerini çağırmanız gerekir.
Çözümler
Gruplama anahtarına karşılık gelmeyen sütunlar için gruplama sonucunu hesaplamak amacıyla SUM, COUNT, AVG ve ANY_VALUE gibi gruplama işlevlerini kullanın.
Sorgu ifadeleri örnekleri
-- Error: Column `c` is not in the GROUP BY key and is not used in an aggregate function.
SELECT a, sum(b), c
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
-- Error message is returned.
FAILED: ODPS-0130071:[1,19] Semantic analysis exception - column reference t.c should appear in GROUP BY key
-- Correct: Use the aggregate function any_value() on column `c`.
SELECT a, sum(b), any_value(c)
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
Hata Mesajı 5: Invalid partition value
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'
Açıklama
Bölüm alanının değeri geçersizdir. MaxCompute tablosundaki bölüm alanlarının değerleri aşağıdaki kurallara uymalıdır:
Bölüm alanının değeri Çince karakterler gibi çift baytlı karakterler içeremez. Değer 1 ila 128 bayt uzunluğunda olmalı; harf, rakam ve desteklenen özel karakterleri içerebilir. Değer bir harfle başlamalıdır.
İzin verilen karakterler arasında boşluk, iki nokta (:), alt çizgi (_), dolar işareti ($), diyez (#), nokta (.), ünlem (!) ve at işareti (@) bulunur.
\t,\nve/gibi kaçış karakterleri dahil diğer karakterlerin davranışı tanımsızdır.
Çözümler
Bölüm alanının değerini geçerli bir değerle değiştirin.
Sorgu ifadeleri örnekleri
-- Create a table.
CREATE TABLE mc_test
(
a bigint
)
partitioned BY
(
ds string
);
-- Error: The partition value '${today}' is invalid.
ALTER TABLE mc_test ADD PARTITION(ds = '${today}');
-- Error message is returned.
FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'
-- Correct: Change the partition value to a valid one, such as '20221206'.
ALTER TABLE mc_test ADD PARTITION(ds='20221206');
Hata Mesajı 6: only oss external table support msck repair syntax
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax
Açıklama
Yalnızca Object Storage Service (OSS) harici tablolar MSCK REPAIR TABLE ifadesini destekler. Daha fazla bilgi için bkz. ORC harici tablolar.
-
Yöntem 1 (Önerilen): Bölümleri otomatik olarak keşfetme ve ekleme.
Bu yöntemle, MaxCompute OSS dizin yapısına göre eksik bölümleri bir OSS harici tabloya otomatik olarak ekler. Bu yöntem, çok sayıda geçmiş bölümü tek seferde doldurmak için kullanışlıdır.
msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];Not
Bu yöntem, özellikle bir OSS dizini çok sayıda bölüm (örneğin, 1.000'den fazla) içeriyorsa artımlı bölümler eklemek için uygun değildir. Yeni bölüm sayısı mevcut bölüm sayısından çok daha az olduğunda,
msckkomutunu sıkça çalıştırmak OSS dizininin çok sayıda tekrarlı taranmasına ve meta veri güncelleme isteklerine yol açar. Bu durum, komutun çalıştırma verimliliğini önemli ölçüde düşürür. Bu nedenle, artımlı bölümler eklenmesi gereken senaryolar için Yöntem 2'yi kullanmanızı öneririz. -
Yöntem 2: Bölümleri manuel olarak ekleme.
Geçmiş bölümler ilk kez yüklendikten sonra yeni bölümlerin düzenli olarak eklenmesi için bu yöntem önerilir. Veri yazma işlerinizi çalıştırmadan önce yeni bölümleri oluşturun. Bir bölüm oluşturulduktan sonra, harici tablo bölümü yenilemeye gerek kalmadan ilgili OSS dizinindeki en son verileri okuyabilir.
ALTER TABLE < mc_oss_extable_name >ADD PARTITION (< col_name >= < col_value >)[ ADD PARTITION (< col_name >= < col_value >)...][location URL];col_name ve col_value değerleri, bölüm veri dosyalarının dizin adlarıyla eşleşmelidir. Örneğin, aşağıdaki OSS dizin yapısını varsayalım: col_name
directionöğesine karşılık gelir ve col_valueN, NE, S, SW, Wöğelerine karşılık gelir. Biradd partitionifadesi bir alt dizine karşılık gelir ve birden fazla OSS alt dizini için birden fazlaadd partitionifadesi gerekir.
Örnek
-
OSS'de
demo8adlı bir dizin oluşturun. Ardından, dizinde iki bölüm klasörü oluşturun ve ilgili dosyaları bunlara yerleştirin.Bölüm klasörü:
$pt1=1/$pt2=2. Dosya adı:demo8-pt1.txt.Bölüm klasörü:
$pt1=3/$pt2=4. Dosya adı:demo8-pt2.txt.
Bir harici tablo oluşturun ve
ptalanlarını belirtin.OSS harici tablosundaki bölüm sütunu adları OSS dizin yapısıyla eşleşmiyorsa dizini belirtin.
--Create an external table
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/";
--Specify the partition fields
MSCK REPAIR TABLE mf_oss_spe_pt ADD PARTITIONS
with PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
--Query data
select * from mf_oss_spe_pt where pt1=1 and pt2=2;
--Result
+------------+------------+------------+------------+
| id | name | pt1 | pt2 |
+------------+------------+------------+------------+
| 1 | kyle | 1 | 2 |
| 2 | nicole | 1 | 2 |
+------------+------------+------------+------------+
--Query 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 |
+------------+------------+------------+------------+
--The mapping between MaxCompute partitions and OSS directories is as follows:
--pt1=8-->8
--pt2=8-->$pt2=8
--Add a partition
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/';
--Disable commit mode and insert data
set odps.sql.unstructured.oss.commit.mode=false;
insert into mf_oss_spe_pt partition (pt1=8,pt2=8) values (1,'tere');
--Query 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 |
+------+------+-----+-----+
Çözümler
MSCK REPAIR komutunu çalıştırabilmeniz için öncelikle belgelerde açıklandığı şekilde bir OSS harici tablosu oluşturmanız gerekir.
Sorgu ifadeleri örnekleri
--Create a common table
CREATE TABLE mc_test
(
a BIGINT
)
partitioned BY
(
ds string
);
--Error. A common table cannot perform the msck repair operation.
msck TABLE mc_test ADD partitions;
FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax
Hata Mesajı 7: column xx in source has incompatible type yy with destination column zz, which has type ttt
Örnek
ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt
Açıklama
Bir tabloya veri eklenirken, hedef tablonun veri türü eklenen verinin veri türüyle eşleşmelidir veya eklenen verinin veri türü hedef tablonun veri türüne örtük olarak dönüştürülebilir olmalıdır. Aksi takdirde hata döndürülür.
Çözümler
Eklenen verinin veri türünün hedef tablonun veri türüyle eşleşmesini sağlamak için sorgu ifadesini değiştirin.
Sorgu ifadeleri örnekleri
-- Create a table.
odps> CREATE TABLE mc_test
(
a datetime
);
-- Error: The data types are incompatible.
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
-- Correct: Insert data of the correct type.
odps> INSERT overwrite TABLE mc_test
VALUES (datetime '2022-12-06 14:23:45');
Hata Mesajı 8: 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)
Örnek
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)
Açıklama
DATEDIFF işlevinin giriş parametrelerinin veri türleri eşleşmiyor. Yaygın bir tür uyuşmazlığı sorunu, MaxCompute V2.0 veri türü sürümü etkinleştirildikten sonra örtük veri türü dönüşümlerine izin verilmemesinden kaynaklanır.
Çözümler
Aşağıdaki yöntemlerden birini kullanın:
SQL sorgusundan önce
set odps.sql.type.system.odps2=false;ekleyin ve birlikte çalıştırın. Bu işlem, veri türü 2.0'ı devre dışı bırakır ve örtük tür dönüşümünü etkinleştirir.Giriş parametrelerinin veri türlerini değiştirin.
Hata Mesajı 9: The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole
Örnek
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.alibabacloud.com/troubleshoot?q=EntityNotExist.Role&product=Sts"}
Açıklama
Bir OSS harici tablosu oluştururken, OSS'e erişmek için kullanılan bir RAM rolü belirtmeniz gerekir. Bu durumda, mevcut olmayan bir RAM rolü kullanılmıştır. Sonuç olarak, rol kimlik doğrulaması başarısız olur.
Çözümler
odps.properties.rolearn parametresinin değerini değiştirin. Alibaba Cloud Resource Name (ARN) biçimi acs:ram::<UID>:role/<Role> şeklindedir.
Aşağıdaki bilgilere dikkat edin:
UID: 16 basamaklı bir sayı.
Role: Resource Access Management (RAM) konsolunda yapılandırılan bir rolün adı.
Örnekler
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'
ARN'i almak için Roller sayfasına gidin. Sayfada, ayrıntılarını görüntülemek için rol adına tıklayın.
RAM konsolunda, Identity Management > Roles sayfasında roller listesinde AliyunPAIAccessingOSSRole rolünü bulun.
Rol ayrıntıları sayfasında, Temel Bilgiler bölümünde ARN alanını bulun. ARN değerini almak için sağındaki kopyala düğmesine tıklayın.
Hata Mesajı 10: encounter runtime exception while evaluating function MAX_PT
Örnek
FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null
Açıklama
Bir SQL ifadesi çalıştırıldığında, max_pt tarafından belirtilen bölüm değişir. Bu durum, veri tutarsızlığı nedeniyle hataya neden olur.
Çözümler
max_pt belirtilen yeni bölümler için SQL ifadelerini çalıştırmayın.
Hata bir yapılandırma görevi için bildirilirse, sistemin yapılandırma görevini yeniden çalıştırmasını sağlayın.
Hata Mesajı 11: column xxx cannot be resolved
Örnek
ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved
Açıklama
xxx sütunu tabloda mevcut değildir.
Çözümler
SQL betiğini kontrol edin ve xxx'i geçerli bir sütun adıyla güncelleyin.
Hata Mesajı 12: evaluate function in class XX for user defined function YY does not match annotation ZZ
Örnek
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
Açıklama
Java veya Python kullanıcı tanımlı işlevi (UDF) kodu UDF yazım standartlarına uymuyor. İşlev imzası açıklamalarındaki bilgiler koddakilerle aynı değil.
Çözümler
İşlev imzası açıklamalarındaki bilgilerin kodla aynı olması için UDF kodunu değiştirin.
Sorgu ifadeleri örnekleri
-- The following is an example of an incorrect Python UDF. The implementation has two input parameters, but the annotation specifies only one.
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
-- The following is another example of an incorrect Python UDF. The evaluate function is missing the self parameter.
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
-- The following is the correct Python UDF.
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
Hata Mesajı 13: Vpc white list: , Vpc id: vpc-xxxx is not allowed to access
Örnek
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.=
Açıklama
Harici tablo kullanarak bir VPC'deki hizmetlere erişirken, geçersiz VPC yapılandırmaları nedeniyle bu hata mesajı görünür.
Çözümler
VPC'de bir IP adresi izin listesini yapılandırın ve MaxCompute'in VPC'deki hizmetlere izin listesindeki bir IP adresinden erişebilmesini sağlayın. Daha fazla bilgi için bkz. Ağ bağlantısı süreci içindeki "VPC üzerinden erişim (özel bağlantı)" bölümü.
Hata Mesajı 14: Semantic analysis exception - physical plan generation failed
Örnek
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.
Açıklama
Bir Alibaba Cloud hizmetine erişirken, hizmete bağlı hizmet bağlantılı rol (SLR) Alibaba Cloud hesabınıza atanmamıştır. Bu nedenle, SLR kullanarak hizmetin verilerine erişemezsiniz.
Çözümler
SLR'yi Alibaba Cloud hesabınıza atamak için buraya tıklayın.