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

MaxCompute:ODPS-0130071:セマンティック解析例外

最終更新日:Mar 26, 2026

以下の各サブエラーは、特定の ODPS-0130071 メッセージに対応しています。ご使用中のエラー出力と一致するメッセージを特定し、該当する修正手順に従ってください。

エラー 1:パーティション列数の不一致

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - 入力パーティション列数 (n) がテーブルのパーティション列数 (m) と一致しません

送信先テーブルには m 個のパーティション列がありますが、INSERT ステートメントでは n 個(ただし n < m)のみが指定されています。すべてのパーティション列を、静的値または動的パーティショニングのいずれかで明示的に指定してください。

-- テーブル定義:2 つのパーティション列 (sale_date, region)
create table if not exists mf_sale_detail
(
  shop_name     string,
  customer_id   string,
  total_price   double
)
partitioned by
(
  sale_date string,
  region    string
);

-- 不適切:パーティション句が指定されていない
insert overwrite table mf_sale_detail
    values ('s1','c1',100.1),('s2','c2',100.2),('s3','c3',100.3);
FAILED: ODPS-0130071:[1,24] セマンティック解析例外 - 入力パーティション列数 (0) がテーブルのパーティション列数 (2) と一致しません

-- 適切:すべてのパーティション列を静的値で指定
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

-- 適切:動的パーティショニング(region の値はデータから取得)
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:マップ結合ヒントなしでの非等値 JOIN 条件

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - マップ結合ヒントなしの JOIN 条件では、等価式(すなわち「=」および「AND」のみ)を指定する必要があります

MaxCompute SQL では、物理的な JOIN アルゴリズムとしてソート・マージ結合が使用されます。このアルゴリズムでは、ON 句に少なくとも 1 つの等価式(=)が必要です。等価列は、左テーブルと右テーブル間でデータをシャッフリングするために使用されます。非等値条件のみ(例:t1.value > t2.value)では、シャッフリング用の等価式が存在しないため、クエリは失敗します。

以下のいずれかの方法で修正してください:

  • ON 句に等価式を追加します。 非等値述語は、追加フィルターとして残すことができます。

  • /*+mapjoin(t1)*/ ヒントを追加します。 マップ結合では、小さい方のテーブルがすべてのワーカーにブロードキャストされ、非等値条件も許容されます。ただし、ブロードキャスト対象のテーブルが小さい場合にのみ使用してください。等価列がない非等値結合では、結果セットが非常に大きくなり、クエリの実行速度が大幅に低下する可能性があります。

-- 不適切:ON 句に非等値式のみが含まれている
odps>select t1. *
from src t1
join src t2
on t1.value > t2.value;

FAILED: ODPS-0130071:[4,4] セマンティック解析例外 - マップ結合ヒントなしの JOIN 条件では、等価式(すなわち「=」および「AND」のみ)を指定する必要があります

-- 適切:等価式を追加;非等値述語は追加フィルターとして保持
odps>select t1. *
from src t1
join src t2
on t1.key = t2.key and t1.value > t2.value;

-- 適切:マップ結合ヒントを追加(t1 をすべてのワーカーにブロードキャスト)
odps>select /*+mapjoin(t1)*/ t1. *
from src t1
join src t2
on t1.value > t2.value;

エラー 3:HASH クラスター化テーブルへの INSERT INTO はサポートされていません

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - HASH クラスター化テーブル/パーティション xxx への INSERT INTO は現在サポートされていません

INSERT INTO では、HASH クラスター化テーブルへデータを書き込むことはできません。以下のいずれかの方法をご利用ください:

  • クラスター化テーブルに対して INSERT OVERWRITE を使用します。

  • 代わりに、クラスター化されていないテーブルへ書き込みます。

-- クラスター化テーブルの作成
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;

-- 不適切:クラスター化テーブルへの INSERT INTO
odps>insert into sale_detail_hashcluster
values ('a', 123, 'id123');

FAILED: ODPS-0130071:[1,13] セマンティック解析例外 - HASH クラスター化テーブル/パーティション meta.sale_detail_hashcluster への INSERT INTO は現在サポートされていません

-- 適切な方法 1:クラスター化されていないテーブルへ書き込み
odps>create table sale_detail
(
  shop_name   STRING,
  total_price decimal,
  customer_id BIGINT
);

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

-- 適切な方法 2:クラスター化テーブルに対して INSERT OVERWRITE を使用
odps>insert overwrite table sale_detail_hashcluster
values ('a', 123, 'id123');

エラー 4:GROUP BY キーに含まれていない列

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - 列参照 xx.yy は GROUP BY キーに含まれる必要があります

GROUP BY 集約後に SELECT リストに出現できる列は、以下の 2 種類のみです:

  • GROUP BY 句に記述された列 — 直接出力されるか、非集計関数を経由して出力されます。

  • GROUP BY 句に含まれていない列 — SUM、COUNT、AVG、ANY_VALUE などの集計関数でラップする必要があります。

GROUP BY キーに含まれていないすべての列に、集計関数を適用してください。グループ内のいずれか 1 つの値を取得したいが、その値がどの行から取得されるかは問わない場合は、ANY_VALUE を使用します。

-- 不適切:列 c が GROUP BY に含まれず、集計関数も使用されていない
odps> select a, sum(b), c
from values (1L, 2L, 3L) as t(a, b, c)
group by a;

FAILED: ODPS-0130071:[1,19] セマンティック解析例外 - 列参照 t.c は GROUP BY キーに含まれる必要があります

-- 適切:ANY_VALUE を使用して、各グループから列 c の値を 1 つ選択
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 の要件を満たしていません。有効なパーティション値は、以下の条件をすべて満たす必要があります:

  • 長さが 1~128 バイトであること

  • 英字で始まること

  • 英字、数字、または以下の特殊文字のみを含むこと:空白、:_$#.!@

  • 漢字などの全角文字を含まないこと

\t\n/ などの文字は動作が未定義であり、使用しないでください。

これらのルールを満たすようにパーティション値を変更してください。

-- パーティション列を持つテーブル
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- 不適切:パーティションフィールドには '${today}' は無効
odps> alter table mc_test add partition(ds = '${today}');

FAILED: ODPS-0130071:[1,40] セマンティック解析例外 - 無効なパーティション値:'${today}'

-- 適切:単純な日付文字列を使用
odps> alter table mc_test add partition(ds='20221206');

エラー 6:OSS 外部テーブル以外で MSCK REPAIR TABLE を使用した場合

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - MSCK REPAIR TABLE 構文は OSS 外部テーブルのみでサポートされます

MSCK REPAIR TABLE は、Object Storage Service (OSS) 外部テーブルでのみ動作します。通常の MaxCompute テーブルに対して実行すると、このエラーが発生します。

まず OSS 外部テーブルを作成し、その後 MSCK REPAIR TABLE を実行してください。「OSS 外部テーブルの作成」については、「OSS 外部テーブルの作成」をご参照ください。

OSS 外部テーブルへのパーティション追加

テーブル作成後にパーティションを登録するには、以下の 2 つの方法があります。

方法 1(一括登録に推奨): MaxCompute が OSS のディレクトリ構造を自動検出し、一致するすべてのパーティションを一度に登録します。

msck repair TABLE <mc_oss_extable_name> ADD partitions [ WITH properties (key:VALUE, key: VALUE ...)];
この方法では、実行時に OSS ディレクトリ全体をスキャンします。パーティション数が 1,000 を超えるディレクトリや、頻繁に新しいパーティションが追加される環境では、フルスキャンを繰り返すことで大量のメタデータ更新リクエストが発生し、効率が低下します。このような場合は、方法 2 をご利用ください。

方法 2(増分登録に推奨): ALTER TABLE を使用してパーティションを個別に追加します。定期スケジュールでパーティションが追加される場合に推奨します。

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 サブディレクトリごとに 1 つの ADD PARTITION 句を指定します。Partition path

MSCK REPAIR TABLE を使用した完全な例

以下の例では、2 つのパーティション列(pt1pt2)を持つ OSS 外部テーブルを作成し、OSS のディレクトリ名と MaxCompute の列名が異なる場合に MSCK REPAIR TABLE を使用してパーティションを登録します。

  1. OSS ディレクトリ構造を作成します:

    • demo8/$pt1=1/$pt2=2/demo8-pt1.txt

    • demo8/$pt1=3/$pt2=4/demo8-pt2.txt

  2. 外部テーブルを作成し、パーティションを登録します:

    -- OSS 外部テーブルの作成
    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/";
    
    -- パーティションの登録:MaxCompute の列名を OSS のディレクトリプレフィックスにマップ
    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. MaxCompute の列名と OSS のディレクトリ名が一致しない場合は、ALTER TABLE を使用して OSS パスを明示的に指定します:

    -- マッピング:pt1=8 は OSS ディレクトリ 8 に対応;pt2=8 は OSS ディレクトリ $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/';
    
    -- コミットモードを無効化し、挿入と照会を実行
    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   |
    +------+------+-----+-----+

エラー例

-- 通常の MaxCompute テーブル(OSS 外部テーブルではない)
odps> create table mc_test
(
  a bigint
)
partitioned by
(
  ds string
);

-- 不適切:通常のテーブルでは MSCK REPAIR TABLE は動作しません
odps> msck table mc_test add partitions;

FAILED: ODPS-0130071:[1,12] セマンティック解析例外 - MSCK REPAIR TABLE 構文は OSS 外部テーブルのみでサポートされます

エラー 7:INSERT 時の互換性のないデータ型

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - ソースの列 xx のデータ型 yy は、送信先列 zz のデータ型 ttt と互換性がありません

挿入しようとしている値のデータ型が、送信先列のデータ型と一致せず、暗黙的な型変換もできない状態です。INSERT ステートメントを修正し、挿入する値のデータ型が送信先列のデータ型と一致するようにしてください。

-- DATETIME 列を持つテーブル
odps> create table mc_test
(
  a datetime
);

-- 不適切:DATETIME 列に BIGINT 値を挿入
odps> insert overwrite table mc_test
values (1L);

FAILED: ODPS-0130071:[2,9] セマンティック解析例外 - ソースの列 __value_col0 のデータ型 BIGINT は、送信先列 a のデータ型 DATETIME と互換性がありません

-- 適切:DATETIME リテラルを挿入
odps> insert overwrite table mc_test
values (datetime '2022-12-06 14:23:45');

エラー 8:DATEDIFF パラメーターの型不一致

エラーメッセージ

ODPS-0130071:[m,n] セマンティック解析例外 - 関数 datediff は (STRING, STRING, STRING) という引数型のオーバーロードされた関数と一致しません。候補は次のとおりです: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 に渡された引数の型が、サポートされているシグネチャのいずれとも一致していません。これは、MaxCompute V2.0 のデータ型エディションが有効になっている場合に多く見られ、V2.0 では型間の暗黙的な変換が無効化されるためです。

DATEDIFF が受け付けるシグネチャは以下のとおりです:

戻り値の型シグネチャ
BIGINTDATEDIFF(DATE, DATE, STRING)
BIGINTDATEDIFF(DATETIME, DATETIME, STRING)
BIGINTDATEDIFF(TIMESTAMP, TIMESTAMP, STRING)
INTDATEDIFF(DATE, DATE)
INTDATEDIFF(STRING, STRING)
INTDATEDIFF(TIMESTAMP, TIMESTAMP)

以下のいずれかの方法で修正してください:

  • 引数をキャスト して、上記のシグネチャのいずれかと一致する型に変換します。

  • V2.0 データ型エディションを無効化 します。SQL ステートメントの前に set odps.sql.type.system.odps2=false; を追加し、両方をまとめて実行します。これにより、暗黙的な型変換が再び有効になります。

エラー 9:OSS 外部テーブルの RAM ロールが見つかりません

エラーメッセージ

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::xxxxxx:role/aliyunodpsdefaultrole. ","Recommend":"https://next.api.aliyun.com/troubleshoot?q=EntityNotExist.Role&product=Sts"}

odps.properties.rolearn で指定された RAM ロールが存在しないため、MaxCompute が Object Storage Service (OSS) にアクセスしようとした際にロール認証が失敗しています。

odps.properties.rolearn を、既存の RAM ロールの Alibaba Cloud リソースネーム(ARN)に正しく設定してください。ARN の形式は以下のとおりです:

acs:ram::<UID>:role/<Role>
  • UID:16 桁の Alibaba Cloud アカウント ID

  • Role:Resource Access Management (RAM) コンソールで設定したロール名

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

ARN を確認するには、RAM コンソールを開き、ロール ページに移動して、目的のロール名をクリックし、表示される ARN を確認してください。

imageimage

エラー 10:MAX_PT のランタイム例外

エラーメッセージ

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

MAX_PT が解決するパーティションが、クエリプランニング時と実行時の間に変更されたため、データの不整合エラーが発生しています。

以下のいずれかの対処法をお試しください:

  • 新規パーティションに対して MAX_PT を指定した SQL ステートメントを実行しないでください。

  • このエラーが構成タスクで発生した場合は、タスクを失敗時に自動リトライするよう設定してください。

エラー 11:列が解決できません

エラーメッセージ

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

参照されたテーブルに列 xxx が存在しません。SQL スクリプトを確認し、xxx を有効な列名に置き換えてください。

エラー 12:UDF の evaluate 関数がアノテーションと一致しません

エラーメッセージ

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

ユーザー定義関数(UDF)クラスの @annotate デコレータで宣言されたシグネチャと、evaluate メソッドの実際のパラメーターが一致していません。UDF のコードを修正し、アノテーションとメソッドのシグネチャを一致させてください。

Python UDF における一般的なミス:

  • アノテーションで入力パラメーターが 1 つと宣言されているが、evaluate メソッドが 2 つの引数(および self)を受け取っている。

  • evaluate メソッドに self パラメーターが欠落している。

-- 不適切:アノテーションは入力 1 つ(bigint->bigint)だが、evaluate は 2 つの引数を受け取る
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

-- 不適切: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

-- 適切:アノテーションと evaluate のシグネチャが一致;self が存在
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 が外部テーブルアクセスのホワイトリストに登録されていません

エラーメッセージ

FAILED: ODPS-0130071:[0,0] セマンティック解析例外 - 物理プラン生成に失敗しました: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 が許可リストに登録されていないため、MaxCompute が VPC ベースのサービスに外部テーブル経由でアクセスできません。VPC を IP アドレスホワイトリストに追加し、MaxCompute がホワイトリスト登録済みの IP アドレスからサービスに到達できることを確認してください。「ネットワーク接続プロセス」の「VPC 経由のアクセス(専用接続)」セクションをご参照ください。ネットワーク接続プロセス

エラー 14:物理プラン生成失敗 — サービスリンクロールが割り当てられていません

エラーメッセージ

FAILED: ODPS-0130071:[0,0] セマンティック解析例外 - 物理プラン生成に失敗しました:com.aliyun.odps.common.table.na.NativeException: kNotFound:The role_arn you provide not exists in HOLO auth service. Please check carefully.

MaxCompute が対象の Alibaba Cloud サービスにアクセスするために使用するサービスリンクロール(SLR)が、お客様のアカウントに割り当てられていません。SLR をアカウントに割り当てるには、RAM クイック承認 をクリックしてください。