本文為您介紹錯誤碼ODPS-0130071:Semantic analysis exception的報錯場景,并提供對應的解決方案。
錯誤1:the number of input partition columns (n) doesn't equal to table's partition columns (m)
錯誤信息示例
FAILED: ODPS-0130071:[m,n] Semantic analysis exception - the number of input partition columns (n) doesn't equal to table's partition columns (m)
錯誤描述
數據插入表是一個分區表,其中有m個分區字段,但是插入數據SQL里只有n個分區列,導致數據寫入找不到分區報錯
解決方案
建議修改插入數據SQL,對齊分區字段。
示例
--創建表
CREATE TABLE if NOT EXISTS mf_sale_detail
(
shop_name STRING,
customer_id STRING,
total_price DOUBLE
)
partitioned BY
(
sale_date string,
region string
);
--錯誤:目標表有2級分區,partition子句只指定了部分或完全沒指定
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)
--正確: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
--正確:使用動態分區
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
錯誤2:expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
錯誤信息示例
ODPS-0130071:[m,n] Semantic analysis exception - expect equality expression (i.e., only use '=' and 'AND') for join condition without mapjoin hint
錯誤描述
MaxCompute SQL模式使用Sort-Merge JOIN作為JOIN的物理算法,需要JOIN condition包括等值表達式;實際Query執行會按照等值表達式中左右表涉及的列做Shuffle。
解決方案
保證Join condition包含等值表達式。
增加mapjoin hint。
說明ON條件只包含非等值表達式,可能會導致JOIN膨脹出特別多的數據,執行緩慢。
示例
--錯誤:join condition只包含非等值表達式
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
--正確:join condition包含有左右兩表列的等值表達式(t1.key = t2.key)
SELECT t1. *
FROM src t1
JOIN src t2
ON t1.key = t2.key AND t1.value > t2.value;
--正確:增加mapjoin hint
SELECT /*+mapjoin(t1)*/ t1. *
FROM src t1
JOIN src t2
ON t1.value > t2.value;
錯誤3:insert into HASH CLUSTERED table/partition xxx is not current supported
錯誤信息
ODPS-0130071:[m,n] Semantic analysis exception - insert into HASH CLUSTERED table/partition xxx is not current supported
錯誤碼描述
目前不支持用INSERT INTO語句往聚簇表里寫數據。
解決方案
建議修改成普通表
修改語句為INSERT OVERWRITE。
示例
--聚簇表建表
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;
--錯誤:insert into cluster表
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
--正確:insert into普通表
CREATE TABLE sale_detail
(
shop_name STRING,
total_price decimal,
customer_id BIGINT
);
INSERT INTO sale_detail
VALUES ('a', 123, 'id123');
--正確:修改為insert overwrite cluster表
INSERT overwrite TABLE sale_detail_hashcluster
VALUES ('a', 123, 'id123');
錯誤4:should appear in GROUP BY key
錯誤信息示例
ODPS-0130071:[m,n] Semantic analysis exception - column reference xx.yy should appear in GROUP BY key
問題描述
GROUP BY語句按照指定的key對輸入表進行聚合,經過聚合之后:
對于聚合key對應的列,可以直接輸出它們的值,也可以調用普通函數(非聚合函數)對它們進行進一步加工和計算。
對于非聚合key對應的列,必須調用聚合函數(例如sum/count/avg等)來計算聚合結果,而不能直接輸出它們的值。
解決方案
對于非聚合key對應的列,必須要調用聚合函數(例如sum/count/avg/any_value等)來計算聚合結果。
Query示例
--錯誤,列c不是group by的key,沒有使用聚合函數
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
--正確,使用聚合函數any_value來計算列c的聚合值
SELECT a, sum(b), any_value(c)
FROM VALUES (1L, 2L, 3L) AS t(a, b, c)
GROUP BY a;
錯誤5:Invalid partition value
錯誤信息示例
ODPS-0130071:[m,n] Semantic analysis exception - Invalid partition value: 'xxx'
問題描述
分區字段的取值非法。MaxCompute的分區字段取值規則如下。
分區值不能包含雙字節字符(如中文),必須以字母開頭,包含字母、數字和允許的字符,長度不超過128字節。
允許的字符包括空格、冒號(:)、下劃線(_)、美元符號($)、井號(#)、英文句點(.)、感嘆號(!)和at(@),其他字符的行為未定義,例如轉義字符
\t
、\n
和/
。
解決方案
修改分區字段的取值,修改為合法值。
Query示例
--創建table
CREATE TABLE mc_test
(
a bigint
)
partitioned BY
(
ds string
);
--錯誤,分區值'${today}'非法
ALTER TABLE mc_test ADD PARTITION(ds = '${today}');
--報錯
FAILED: ODPS-0130071:[1,40] Semantic analysis exception - Invalid partition value: '${today}'
--正確,修改分區值為合法值'20221206'
ALTER TABLE mc_test ADD PARTITION(ds='20221206');
錯誤6:only oss external table support msck repair syntax
錯誤信息示例
ODPS-0130071:[m,n] Semantic analysis exception - only oss external table support msck repair syntax
問題描述
只有OSS外部表才支持msck repair操作,參考文檔補全OSS外部表分區數據語法。
方式一(推薦):自動解析OSS目錄結構,識別分區,為OSS外部表添加分區信息。
通過這種方式,MaxCompute會根據您創建OSS外部表時指定的分區目錄,自動補全OSS外部表的分區,而不用逐個按照分區列名和名稱增加,這適用于一次性補全全部缺失的歷史分區的場景,
msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];
說明該方式不適用于處理增量數據的補充,尤其是在OSS目錄包含大量分區(如超過1000個)的情況下。由于當新增分區遠少于已有分區時,頻繁使用
msck
命令會導致對OSS目錄大量的重復掃描和元數據更新請求,這將顯著降低命令執行的效率。因此,對于需要更新增量分區的場景,建議您采用方式二。方式二:手動執行如下命令為OSS外部表添加分區信息。
當歷史分區已經創建完成,需要頻繁地周期性追加分區,建議采用該方式,在執行數據寫入任務之前提前創建好分區。分區創建完成后,即使OSS上有新數據寫入,也無需刷新對應分區,外部表即可讀取OSS目錄上的最新數據。
ALTER TABLE < mc_oss_extable_name > ADD PARTITION (< col_name >= < col_value >)[ ADD PARTITION (< col_name >= < col_value >)...][location URL];
col_name和col_value的值需要與分區數據文件所在目錄名稱對齊。假設,分區數據文件所在的OSS目錄結構如下圖,col_name對應
direction
,col_value對應N、NE、S、SW、W
。一個add partition
對應一個子目錄,多個OSS子目錄需要使用多個add partition
。示例
在OSS上創建目錄
demo8
并分別在下面建立兩個分區文件夾,分別放入對應的文件。分區文件夾:
$pt1=1/$pt2=2
,文件名稱:demo8-pt1.txt
。分區文件夾:
$pt1=3/$pt2=4
,文件名稱:demo8-pt2.txt
。
創建外部表并指定
pt
字段。--創建外部表 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/"; --指定分區字段 MSCK REPAIR TABLE mf_oss_spe_pt ADD PARTITIONS with PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2'); --查詢數據 select * from mf_oss_spe_pt where pt1=1 and pt2=2; --返回 +------------+------------+------------+------------+ | 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 | +------------+------------+------------+------------+
當OSS外表中的分區列名與OSS的目錄結構不一致時,需要指定目錄。
--MaxCompute分區與OSS的目錄對應如下: --pt1=8-->8 --pt2=8-->$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/'; --需要關閉commit mode --插入數據 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 | +------+------+-----+-----+
解決方案
按照文檔的描述,創建OSS外部表,才能執行MSCK REPAIR命令。
Query示例
--創建普通表
CREATE TABLE mc_test
(
a BIGINT
)
partitioned BY
(
ds string
);
--錯誤,普通表不能執行msck repair操作。
msck TABLE mc_test ADD partitions;
FAILED: ODPS-0130071:[1,12] Semantic analysis exception - only oss external table support msck repair syntax
錯誤7:column xx in source has incompatible type yy with destination column zz, which has type ttt
錯誤信息示例
ODPS-0130071:[m,n] Semantic analysis exception - column xx in source has incompatible type yy with destination column zz, which has type ttt
問題描述
向表中插入數據的時候,要求目標表的數據類型和插入數據的數據類型相匹配,或者是插入的數據可以隱式轉換為目標表的數據類型,否則就會報錯。
解決方案
修改Query,使得插入數據的類型和目標表的數據類型相匹配。
Query示例
--創建表
odps> CREATE TABLE mc_test
(
a 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
--正確,插入正確類型的數據
odps> INSERT overwrite TABLE mc_test
VALUES (datetime '2022-12-06 14:23:45');
錯誤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)
錯誤信息示例
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)
錯誤描述
使用的函數DATEDIFF入參類型不匹配,常見的類型不匹配問題,是由于開啟數據類型2.0隱式轉換關閉引起。
解決方案
您可以通過以下方式解決:
在SQL前添加
set odps.sql.type.system.odps2=false;
并與SQL一同運行,關閉數據類型2.0打開隱式轉換處理。修改輸入參數數據類型。
錯誤9:The role not exists: acs:ram::xxxxxx:role/aliyunodpsdefaultrole
錯誤信息示例
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"}
錯誤描述
在創建OSS外部表時,需要指定訪問OSS的RAM Role,在此示例中指定了一個不存在的Role。導致系統在角色驗證時失敗,提示指定的角色不存在。
解決方案
修改創建外表ARN(odps.properties.rolearn)參數的值,ARN值的具體組成格式為acs:ram::<UID>:role/<Role>
。
其中:
UID:正常為16位數字。
Role:為RAM上用戶自己定義的角色名稱。
示例
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'
ARN具體獲得方法請點擊查看,進入頁面點擊角色名稱進行查看,示例如下:
錯誤10:encounter runtime exception while evaluating function MAX_PT
錯誤信息示例
FAILED: ODPS-0130071:[33,26] Semantic analysis exception - encounter runtime exception while evaluating function MAX_PT, detailed message: null
錯誤描述
在SQL執行的過程中,max_pt對應的最大分區發生變化,已經不是最大的分區,觸發引起數據不一致的檢測報錯。
解決方案
避免在新生成分區時執行帶有max_pt的SQL語句。
配置任務出錯自動重跑。
錯誤11:column xxx cannot be resolved
錯誤信息示例
ODPS-0130071:[73,12] Semantic analysis exception - column xxx cannot be resolved
錯誤描述
對應表中xxx列不存在。
解決方案
檢查SQL腳本,更新xxx至正確的列名。
錯誤12:evaluate function in class XX for user defined function YY does not match annotation ZZ
錯誤信息示例
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
錯誤描述
用戶寫UDF(Java或者Python UDF)的時候,代碼不符合UDF的規范,函數簽名annotation和實際的代碼不匹配。
解決方案
修改用戶的UDF代碼,使得函數簽名annotation和實際的代碼相匹配。
Query示例
--下面是一個不規范的Python UDF示例,實際代碼有兩個輸入參數,但是annotation中只有一個輸入參數
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
--下面是另外一個不規范的Python UDF示例,evaluate函數沒有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
--下面是正確的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
錯誤13:Vpc white list: , Vpc id: vpc-xxxx is not allowed to access
錯誤信息示例
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.=
錯誤描述
用戶訪問外部表時,VPC配置不正確,VPC沒有打通MaxCompute的數據訪問。
解決方案
在VPC中配置MaxCompute可以訪問的白名單。具體請參見訪問VPC方案(專線直連)。
錯誤14:Semantic analysis exception - physical plan generation failed
錯誤信息示例
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.
錯誤描述
用戶訪問阿里云產品時,沒有開通服務角色(SLR),不能通過云產品服務角色授權訪問對方數據。
解決方案
單擊訪問控制開通SLR服務角色。