以下の各サブエラーは、特定の 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 句を指定します。![]()
MSCK REPAIR TABLE を使用した完全な例
以下の例では、2 つのパーティション列(pt1、pt2)を持つ OSS 外部テーブルを作成し、OSS のディレクトリ名と MaxCompute の列名が異なる場合に MSCK REPAIR TABLE を使用してパーティションを登録します。
OSS ディレクトリ構造を作成します:
demo8/$pt1=1/$pt2=2/demo8-pt1.txtdemo8/$pt1=3/$pt2=4/demo8-pt2.txt
外部テーブルを作成し、パーティションを登録します:
-- 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 | +------------+------------+------------+------------+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 が受け付けるシグネチャは以下のとおりです:
| 戻り値の型 | シグネチャ |
|---|---|
| BIGINT | DATEDIFF(DATE, DATE, STRING) |
| BIGINT | DATEDIFF(DATETIME, DATETIME, STRING) |
| BIGINT | DATEDIFF(TIMESTAMP, TIMESTAMP, STRING) |
| INT | DATEDIFF(DATE, DATE) |
| INT | DATEDIFF(STRING, STRING) |
| INT | DATEDIFF(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 アカウント IDRole:Resource Access Management (RAM) コンソールで設定したロール名
例
'odps.properties.rolearn'='acs:ram::189xxxxxxx76:role/aliyunpaiaccessingossrole'ARN を確認するには、RAM コンソールを開き、ロール ページに移動して、目的のロール名をクリックし、表示される ARN を確認してください。


エラー 10:MAX_PT のランタイム例外
エラーメッセージ
FAILED: ODPS-0130071:[33,26] セマンティック解析例外 - 関数 MAX_PT の評価中にランタイム例外が発生しました。詳細メッセージ:nullMAX_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 クイック承認 をクリックしてください。