すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:ODPS-0130071

最終更新日:Jan 17, 2025

エラーコード: ODPS-0130071: セマンティック解析例外

エラーメッセージ1: 入力パーティション列の数 (n) がテーブルのパーティション列 (m) と等しくない

サンプル

失敗: ODPS-0130071:[m,n] セマンティック解析例外-入力パーティション列の数 (n) がテーブルのパーティション列 (m) と等しくない

説明

データが挿入されるテーブルは、パーティションテーブルである。 テーブルにはm個のパーティションフィールドがありますが、データを挿入するために実行されるSQL文では、n (n < m) 個のパーティションキー列が指定されています。 その結果、特定のパーティションへのデータの書き込みに失敗し、エラーが返されます。

ソリューション

SQL文で指定されたパーティションキー列がテーブルのパーティションフィールドと一致するように、SQL文を変更します。

-- 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
);

-- Incorrect usage: The destination table has two levels of partitions. The partition clause specifies some or none of the partitions.
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 usage: The partition clause specifies complete partition information.
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 usage: Dynamic partitioning is used.
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: 期待等式式 (つまり、'=' と 'AND' のみを使用) 結合条件なしでmapjoinヒント

サンプル

ODPS-0130071:[m,n] セマンティック分析例外-mapjoinヒントなしで結合条件に等式式を期待する (つまり、'=' と 'AND' のみを使用する)

説明

MaxCompute SQLでは、ソートマージ結合は結合操作の物理アルゴリズムとして使用されます。 結合条件には、同等の式を含める必要があります。 実際のクエリ操作では、等価式の左右のテーブルの列に基づいてシャッフルが実行されます。

ソリューション

(1) join条件に同等の式が含まれていることを確認します。

(2) マップ結合ヒントを追加します。 (注: ON条件に非等価式のみが含まれる場合、結合演算後に大量のデータが生成される可能性があります。 その結果、クエリ操作に時間がかかります。

-- Incorrect usage: The join condition contains only a non-equivalent expression.
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

-- Correct usage: The join condition contains the equivalent expression t1.key = t2.key.
odps>select t1. *
from src t1
join src t2
on t1.key = t2.key and t1.value > t2.value;

-- Correct usage: A map join hint is added.
odps>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] セマンティック分析例外-HASH CLUSTEREDテーブル /パーティションへの挿入xxxは現在サポートされていません

説明

INSERT INTOステートメントを使用して、クラスタ化されたテーブルにデータを書き込むことはできません。

ソリューション

(1) テーブルを共通テーブルに変更します。

(2) INSERT INTOステートメントをINSERT OVERWRITEステートメントに変更します。

-- Create a clustered table.
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;

-- Incorrect usage: Insert data into the clustered table.
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

-- Correct usage: Insert data into a common table.
odps>create table sale_detail
(
  shop_name   STRING,
  total_price decimal,
  customer_id BIGINT
);

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

-- Correct usage: Execute the INSERT OVERWRITE statement for the clustered table.
odps>insert overwrite table sale_detail_hashcluster
values ('a', 123, 'id123');

エラーメッセージ4: GROUP BYキーに表示されるはずです

サンプル

ODPS-0130071:[m,n] セマンティック分析例外-列参照xx.yyがGROUP BYキーに表示されるはずです

説明

GROUP BY句は、指定されたキーに基づいて入力テーブルのデータを集計します。 集計操作が実行された後、次の結論が得られます。

  1. 集計キーに対応する列については、出力値を直接取得できます。 共通関数 (非集計関数) を呼び出して、列内のデータをさらに処理および計算することもできます。

  2. 集計キーに対応しない列については、出力値を直接取得することはできません。 集計結果を計算するには、SUM、COUNT、AVGなどの集計関数を呼び出す必要があります。

ソリューション

集計キーに対応しない列については、SUM、COUNT、AVG、ANY_VALUEなどの集計関数を呼び出して、集計結果を計算します。

クエリの例

-- Incorrect usage: Column c does not correspond to the key of GROUP BY. No aggregate function is used.
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

-- Correct usage: Use the aggregate function ANY_VALUE to calculate the aggregate value of Column c.
odps> select a, sum(b), any_value(c)
from values (1L, 2L, 3L) as t(a, b, c)
group by a;

エラーメッセージ5: 無効なパーティション値

サンプル

ODPS-0130071:[m,n] セマンティック解析例外-無効なパーティション値: 'xxx'

説明

パーティションフィールドの値が無効です。 MaxComputeテーブルのパーティションフィールドの値は、次のルールに従う必要があります。

  • パーティションフィールドの値には、漢字などの2バイト文字を含めることはできません。 値は1 ~ 128バイトで、英数字、およびサポートされている特殊文字を使用できます。 値は文字で始まる必要があります。

  • 次の特殊文字がサポートされています: スペース、コロン (:) 、アンダースコア (_) 、ドル記号 ($) 、数字記号 (#) 、ピリオド (.) 、感嘆符 (!) 、およびアット記号 (@) 。 エスケープ文字 \t\n/など、他の文字の動作は定義されていません。

ソリューション

パーティションフィールドの値を有効な値に変更します。

クエリの例

-- Create a table.
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- Incorrect usage: The value '${today}' is invalid for the partition field.
odps> alter table mc_test add partition(ds = '${today}');

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

-- Correct usage: Change the value of the partition field to the valid value '20221206'.
odps> alter table mc_test add partition(ds='20221206');

エラーメッセージ6: 唯一のoss外部テーブルサポートmsck修復構文

サンプル

ODPS-0130071:[m,n] セマンティック解析例外のみoss外部テーブルサポートmsck修復構文

説明

Object Storage Service (OSS) 外部テーブルのみが、MSCK REPAIR TABLEステートメントをサポートしています。 詳細については、「OSS外部テーブルの作成」をご参照ください。

  • 方法1 (推奨): MaxComputeは、OSSディレクトリ構造を自動的に解析し、パーティションを識別し、パーティションデータをOSS外部テーブルに追加します。

    このように、MaxComputeは、パーティションキー列とパーティション名の名前に基づいてパーティションを1つずつ追加するのではなく、OSS外部テーブルの作成時に指定したパーティションディレクトリに基づいてOSS外部テーブルのパーティションを自動的に補足します。 この方法は、欠落しているすべての履歴パーティションを一度に補完するのに適しています。

    msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];
    説明

    この方法は、パーティションが継続的に追加されるシナリオ、特にOSSディレクトリに多数のパーティションが含まれるシナリオには適していません。 たとえば、OSSディレクトリに1,000を超えるパーティションが含まれている場合は、この方法を使用しないことを推奨します。 新しいパーティションの数が既存のパーティションの数よりもはるかに少ない場合、msckコマンドを頻繁に使用すると、OSSディレクトリに対するスキャンとメタデータの更新要求が多数繰り返されます。 これは、コマンドの実行効率を著しく低下させる。 したがって、新しいパーティションのデータを更新する場合は、方法2を使用することをお勧めします。

  • 方法2: 次のコマンドを手動で実行して、パーティションデータを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サブディレクトリの名前と一致している必要があります。 次の図に示すパーティションデータファイルのOSSディレクトリ構造を使用する場合、col_nameの値はdirectioncol_valueの値はN、NE、S、SW、Wです。ALTER TABLE文の1つのadd partition句を使用して、OSSサブディレクトリにマップされているパーティションを追加します。 add partition句の数は、OSSサブディレクトリの数と同じである必要があります。分区路径

  • サンプル文

    1. OSSにdemo8という名前のディレクトリを作成し、そのディレクトリの下に関連ファイルを格納する2つのパーティションフォルダーを作成します。

      • demo8-pt1.txtファイルは、パーティションフォルダ $pt1=1/$pt2=2に保存されます。

      • demo8-pt2.txtファイルは、パーティションフォルダ $pt1=3/$pt2=4に保存されます。

    2. 外部テーブルを作成し、partitionフィールドを指定します。

      -- Create an OSS 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 partition fields.
      MSCK REPAIR TABLE  mf_oss_spe_pt ADD PARTITIONS
      WITH PROPERTIES ('odps.msck.partition.column.mapping'='pt1:$pt1,pt2:$pt2');
      
      -- Query data from the external table.
      SELECT * FROM mf_oss_spe_pt WHERE pt1=1 AND pt2=2;
      -- The following result is returned:
      +------------+------------+------------+------------+
      | id         | name       | pt1        | pt2        |
      +------------+------------+------------+------------+
      | 1          | kyle       | 1          | 2          |
      | 2          | nicole     | 1          | 2          |
      +------------+------------+------------+------------+
      -- Query data from the external table.
      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ディレクトリ構造と一致しない場合は、OSSディレクトリを指定します。

      -- Mappings between MaxCompute partitions and OSS directories.
      --pt1=8-->8
      --pt2=8-->$pt2=8
      -- Add partitions.
      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 the commit mode.
      -- Insert data into the external table.
      SET odps.sql.unstructured.oss.commit.mode=false;
      INSERT INTO mf_oss_spe_pt PARTITION (pt1=8,pt2=8) VALUES (1,'tere');
      -- Query data from the external table.
      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   |
      +------+------+-----+-----+
                                      

ソリューション

MSCK REPAIR tableステートメントを実行する前に、ドキュメントの指示に従ってOSS外部テーブルを作成します。

クエリの例

-- Create a common table.
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- Incorrect usage: The MSCK REPAIR TABLE statement cannot be executed for a common table. 
odps> msck table mc_test add partitions;

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

エラーメッセージ7: ソースの列xxには、宛先列zzと互換性のないタイプyyがあり、タイプttt

サンプル

ODPS-0130071:[m,n] セマンティック分析例外-ソースの列xxは、タイプがtttの宛先列zzと互換性のないタイプyyを持っています

説明

データがテーブルに挿入されるとき、宛先テーブルのデータ型は挿入されたデータのデータ型と一致する必要があります。または、挿入されたデータのデータ型を宛先テーブルのデータ型に暗黙的に変換できます。 それ以外の場合は、エラーが返されます。

ソリューション

クエリ文を変更して、挿入されたデータのデータ型がターゲットテーブルのデータ型と一致するようにします。

クエリの例

-- Create a table.
odps> create table mc_test
(
  a datetime
);

-- Incorrect usage: A data type mismatch issue occurs.
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 usage: Data of a valid data type is inserted.
odps> insert overwrite table mc_test
values (datetime '2022-12-06 14:23:45');

エラーメッセージ8: 関数dateardiffは (STRING、STRING、STRING) でオーバーロードされた関数と一致できません。候補はBIGINT datediff (DATE arg0、DATE arg1、STRING arg2) です。ストリングarg1); INT DATEDIFF(TIMESTAMP arg0、TIMESTAMP arg1)

サンプル

ODPS-0130071:[m,n] DATarantic解析例外-関数datediffは (STRING, STRING, STRING, STRING) でオーバーロードされた関数と一致できません。INT DATEDIFF(STRING arg0, STRING arg1); INT DATEDIFF(TIMESTAMP arg0, TIMESTAMP arg1)

説明

関数DATEDIFFの入力パラメータのデータ型が一致しません。 MaxCompute V2.0データ型エディションが有効になった後、暗黙的なデータ型変換が許可されないため、一般的なタイプの不一致の問題が発生します。

ソリューション

次のいずれかの方法を使用します。

(1) 実行するsql文の前にset odps. SQL. type.system.odps2=false; を追加し、それらをまとめてコミットして、MaxCompute V2.0データ型エディションを無効にします。 MaxCompute V2.0データ型エディションを無効にすると、暗黙的なデータ型変換が許可されます。

(2) 入力パラメーターのデータ型を変更します。

エラーメッセージ9: ロールが存在しません: acs:ram::xxxxxx:role/aliyunodpsdefaultrole

サンプル

ODPS-0130071:[1,1] セマンティック分析例外-外部テーブルチェックの失敗、エラーメッセージ: java.lang.RuntimeException: {"RequestId":"A7BFAD2F-8982-547A-AB5E-93DAF5061FBD","HostId":"sts.aliyuncs.com","Code":"EntityNotExist.Role","message":"The role not exists: acs:ram::: xxxxxxxx: role /aliyunodpsdefautrole。 "," 推奨 ":" https://next.api.aliyun.com/troubleshoot?q=EntityNotExist.Role&product=Sts "}

説明

OSS外部テーブルを作成するときは、OSSへのアクセスに使用するRAMロールを指定する必要があります。 この場合、存在しないRAMロールが使用されます。 その結果、ロール認証は失敗します。

ソリューション

Alibaba Cloud Resource Name (ARN) を指定するodps.properties.rolearnパラメーターの値を変更します。 ARNの形式は次のとおりです。

"acs:ram ::< UID>:role/<Role>"

次の情報に注意してください。

UID: 16桁の番号。

Role: Resource Access Management (RAM) コンソールで構成されているロールの名前。

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

ARNを取得するには、RAMコンソールに移動します。 次の図に示すように、ロールページでロール名をクリックしてARNを表示します。

image

image

エラーメッセージ10: 関数MAX_PTの評価中にランタイム例外が発生

サンプル

FAILED: ODPS-0130071:[33,26] セマンティック解析例外-関数MAX_PTの評価中のランタイム例外、詳細メッセージ: null

説明

SQL文が実行されると、max_ptで指定されたパーティションが変更されます。 その結果、データの不整合によりエラーが返されます。

ソリューション

1. 新しいパーティションにmax_ptを指定したSQL文は実行しないでください。

2. 構成タスクに対してエラーが報告された場合、システムが構成タスクを再実行できるようにする

エラーメッセージ11: 列xxxを解決できません

サンプル

ODPS-0130071:[73,12] セマンティック分析例外-列xxxを解決できません

説明

xxx列はテーブルに存在しません。

ソリューション

SQLスクリプトを確認し、xxxを有効な列名に更新します。

エラーメッセージ12: ユーザー定義関数YYのクラスXXの評価関数がアノテーションZZと一致しない

サンプル

FAILED: ODPS-0130071:[1,8] セマンティック分析例外-クラステストの評価関数。ユーザー定義関数my_plusのMyPlusがアノテーションbigint->bigintと一致しません

説明

JavaまたはPythonのユーザー定義関数 (UDF) のコードは、UDFの書き込み標準に準拠していません。 関数署名注釈の情報は、コードの情報と同じではありません。

ソリューション

UDFコードを変更して、関数署名注釈の情報がコードの情報と同じになるようにします。

クエリの例

-- The following sample code is the invalid code of a Python UDF. Two input parameters are included in the code, but only one input parameter is included in the 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

-- The following sample code is the invalid code of another Python UDF. The self parameter is not included in the evaluate function.
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 sample code is the valid code of a 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ホワイトリスト: 、Vpc id: vpc-xxxxはアクセスできません

サンプル

失敗: ODPS-0130071:[0,0] セマンティック分析例外-物理プランの生成に失敗しました: com.aliyun.odps.lot.cbo.plan.splitting.impl.vpc.AliHyperVpcRuntimeException: Vpcホワイトリスト: 、Vpc id: vpc-xxxxはアクセスできません。 アクセス許可vpc idリストを設定するには、プロジェクト所有者に連絡してください。=

説明

外部テーブルを使用してVPC内のサービスにアクセスすると、無効なVPC設定が原因でエラーメッセージが表示されます。

ソリューション

VPCでIPアドレスホワイトリストを設定し、MaxComputeがホワイトリストのIPアドレスからVPCのサービスにアクセスできるようにします。 詳細については、「ネットワーク接続プロセス」の「VPC経由のアクセス (専用接続) 」セクションをご参照ください。

エラーメッセージ14: セマンティック分析例外-物理プランの生成に失敗しました:

Sample

失敗: ODPS-0130071:[0,0] セマンティック分析例外-物理プランの生成に失敗しました: com.aliyun.odps.com mon.table.na.NativeException: kNotFound: HOLO認証サービスに提供していないrole_arnが存在します。 注意深く確認してください。

説明

Alibaba Cloudサービスにアクセスすると、サービスにリンクされているサービスにリンクされたロール (SLR) はAlibaba Cloudアカウントに割り当てられません。 そのため、SLRを使用してサービスのデータにアクセスすることはできません。

ソリューション

こちらをクリックして、SLRをAlibaba Cloudアカウントに割り当てます。