全部產品
Search
文件中心

MaxCompute:ODPS-0130071

更新時間:Aug 07, 2024

本文為您介紹錯誤碼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對輸入表進行彙總,經過彙總之後:

  1. 對於彙總key對應的列,可以直接輸出它們的值,也可以調用普通函數(非彙總函式)對它們進行進一步加工和計算。

  2. 對於非彙總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_namecol_value的值需要與分區資料檔案所在目錄名稱對齊。假設,分區資料檔案所在的OSS目錄結構如下圖,col_name對應directioncol_value對應N、NE、S、SW、W。一個add partition對應一個子目錄,多個OSS子目錄需要使用多個add partition分區路徑

  • 樣本

    1. 在OSS上建立目錄demo8並分別在下面建立兩個分區檔案夾,分別放入對應的檔案。

      • 分區檔案夾:$pt1=1/$pt2=2,檔案名稱:demo8-pt1.txt

      • 分區檔案夾:$pt1=3/$pt2=4,檔案名稱:demo8-pt2.txt

    2. 建立外部表格並指定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          |
      +------------+------------+------------+------------+
      
                                      
    3. 當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具體獲得方法請點擊查看,進入頁面點擊角色名稱進行查看,樣本如下:

image

image

錯誤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服務角色。