このトピックでは、MaxCompute の DECIMAL データ型の概念、考慮事項、ユースケース、および例について説明します。
概要
DECIMAL は、高精度な 10 進数演算向けに設計されたデータ型です。厳密な精度が求められる金融や科学技術計算のシナリオで広く使用されます。MaxCompute では、DECIMAL 型の動作はプロジェクトのデータ型エディションによって異なります:
DECIMAL 2.0 データ型が無効な場合
DECIMAL 型は、デフォルトで
DECIMAL(54,18)の固定精度形式を使用します。精度 (最大桁数) とスケール (小数位数) は指定できません。整数部の範囲は -1036+1 ~ 1036-1 です。小数部は 10-18 まで正確です。このデータ型を使用するには、次のフラグを設定します:SET odps.sql.decimal.odps2=false;DECIMAL 2.0 データ型が有効な場合
デフォルトは
DECIMAL(38,18)です。精度 (最大桁数) とスケール (小数位数) を指定できます。精度の要件に基づき、次の 2 つのカテゴリを使用できます:標準 DECIMAL:精度の範囲は [1, 38]、スケールの範囲は [0, precision] です。このデータ型を使用するには、次のフラグを設定します:
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true;スケールの制限:
odps.sql.decimal2.extended.scale.enable=false(デフォルト) の場合:サポートされるスケールの範囲は
[0, 18]です。すべての計算結果は小数点以下 18 桁に切り捨てられます。odps.sql.decimal2.extended.scale.enable=trueの場合:スケールの範囲が
[0, 38]の高精度計算がサポートされます。
DECIMAL256:精度の範囲は [39, 76]、スケールの範囲は [0, precision] です。このデータ型を使用するには、次のフラグを設定します:
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; SET odps.sql.decimal256.enable=true;使用上の制限:
odps.sql.decimal256.auto.promotion=true;を設定して自動型昇格を有効にすると、システムは必要に応じて計算結果をより高精度な DECIMAL256 型に自動昇格させ、より広い範囲の高精度計算をサポートします。詳細な例については、例 5 をご参照ください。odps.sql.decimal256.enable=trueを有効にする場合は、odps.sql.type.system.odps2とodps.sql.decimal.odps2もtrueに設定する必要があります。そうしないと、クエリでエラーが返されます。基本的な算術関数、集計関数、および一般的な式 (SUM、AVG、MEDIAN、MAX、MIN を含む) をサポートします。DECIMAL256 はプライマリキー (PK) またはクラスターキーとして使用できません。
注意事項
1 つのテーブルに旧版と新版の DECIMAL データ型を混在させることはできません。
DECIMAL 2.0 データ型を有効にした状態で、Hive 互換モード (
SET odps.sql.hive.compatible=true;) または BigQuery 互換モード (SET odps.sql.bigquery.compatible=true;) を有効にすると、DECIMAL(precision, scale)の値は、データのインポート (Tunnel Upload) および SQL 計算時に、小数点以下の桁数がスケールを超える場合は丸められます。整数部が上限を超えてもエラーは返されませんが、入力データは NULL になります。odps.sql.decimal.tostring.trimzeroをtrueに設定すると、小数点以下の末尾のゼロが削除されます。falseに設定すると、末尾のゼロが保持されます。これはテーブルから読み取られる値にのみ適用され、静的な値には適用されません。デフォルト値:true。
ユースケース
データ型 | 設定 | 説明 |
レガシー DECIMAL |
| DECIMAL 2.0 データ型は無効です。精度とスケールは指定できません。デフォルト: |
標準 DECIMAL |
| 精度が最大 38 の標準 DECIMAL 型です。計算時、スケールは 18 に制限されます。 |
| 精度が最大 38 の標準 DECIMAL 型です。スケールの範囲が | |
DECIMAL256 |
| DECIMAL256 を有効にしますが、計算に含まれる DECIMAL 値の精度が 38 以下の場合は従来の動作を維持します。既存のジョブの動作を変更せずに、標準 DECIMAL (スケールの範囲 |
| DECIMAL256 を有効にしますが、計算に含まれる DECIMAL 値の精度が 38 以下の場合は従来の動作を維持します。既存のジョブの動作を変更せずに、標準 DECIMAL (スケールの範囲 | |
| DECIMAL256 をフル機能で有効にします。後方互換性の要件がない新規プロジェクトに適しています。 |
例
DECIMAL 2.0 データ型が無効な場合
例 1: DECIMAL 型はデフォルトで DECIMAL(54,18) になり、調整できません。
-- DECIMAL 2.0 データ型を無効にします。
SET odps.sql.decimal.odps2=false;
-- 列 a は固定の精度/スケール (54,18) の DECIMAL 型です。調整はサポートされません。
CREATE OR REPLACE TABLE foo_t(a DECIMAL);
-- このモードでは精度/スケールの指定がサポートされないため、次の CREATE 文はエラーを返します。
CREATE OR REPLACE TABLE foo_t(a DECIMAL(5,2));
-- Error: FAILED: ODPS-0130071:[1,33] Semantic analysis exception - precision and scale is not currently supported in current mode, 'SET odps.sql.decimal.odps2=true' to enableDECIMAL 2.0 データ型が有効な場合
例 1: DECIMAL 型は精度とスケールの指定をサポートします。
-- DECIMAL 2.0 データ型を有効にします。 SET odps.sql.decimal.odps2=true; CREATE OR REPLACE TABLE foo_t(a DECIMAL(4,2));例 2: DECIMAL 型で精度とスケールを指定しない場合、デフォルト値は Hive 互換モードが有効かどうかによって異なります。Hive 互換モードが無効の場合、デフォルト値は DECIMAL(38,18) です。Hive 互換モードが有効の場合、デフォルト値は DECIMAL(10,0) です。
-- Hive 互換モードを無効にして DECIMAL 2.0 データ型を有効にします。 SET odps.sql.decimal.odps2=true; SET odps.sql.hive.compatible=false; CREATE OR REPLACE TABLE foo_t(a DECIMAL); -- 列 a のデータ型は DECIMAL(38,18) です。 DESC foo_t; -- Result: +------------------------------------------------------------------------------------+ | Owner: ALIYUN$odps_pd_testcloud_com | | Project: xxxx | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2026-04-21 13:36:21 | | LastDDLTime: 2026-04-21 13:36:21 | | LastModifiedTime: 2026-04-21 13:36:21 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | decimal(38,18) | | | +------------------------------------------------------------------------------------+ -- Hive 互換モードを有効にして DECIMAL 2.0 データ型を有効にします。 SET odps.sql.decimal.odps2=true; SET odps.sql.hive.compatible=true; CREATE OR REPLACE TABLE foo_t(a DECIMAL); -- 列 a のデータ型は DECIMAL(10,0) です。 DESC foo_t; -- Result: +------------------------------------------------------------------------------------+ | Owner: ALIYUN$odps_pd_testcloud_com | | Project: ***_project | | TableComment: | +------------------------------------------------------------------------------------+ | CreateTime: 2026-04-21 13:38:04 | | LastDDLTime: 2026-04-21 13:38:04 | | LastModifiedTime: 2026-04-21 13:38:04 | +------------------------------------------------------------------------------------+ | InternalTable: YES | Size: 0 | +------------------------------------------------------------------------------------+ | Native Columns: | +------------------------------------------------------------------------------------+ | Field | Type | Label | Comment | +------------------------------------------------------------------------------------+ | a | decimal(10,0) | | | +------------------------------------------------------------------------------------+例 3: 標準 DECIMAL の場合、精度の範囲は [1, 38] で、スケールの範囲は [0, precision] です。スケールの範囲が [0, 38] の高精度計算を有効にするには、
SET odps.sql.decimal2.extended.scale.enable=true;を設定します。SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; -- DECIMAL 2.0 データ型を有効にします。 SET odps.sql.decimal2.extended.scale.enable=true; -- スケールの範囲が [0,38] の高精度計算を有効にします。 -- 2 つの DECIMAL 値を乗算します。結果のデータ型は decimal(22,19) です。 EXPLAIN SELECT CAST(1bd AS DECIMAL(10,9))*CAST(1bd AS DECIMAL(11,10)); -- Result: job0 is root job In Job job0: root Tasks: M1 In Task M1: VALUES: _c0 : {1} Statistics: Num rows: 1.0, Data size: 16.0 FS: output: Screen schema: _c0 (decimal(22,19)) Statistics: Num rows: 1.0, Data size: 16.0 -- フラグを false に設定します。出力型のスケールは 18 に切り捨てられ、decimal(22,18) になります。 SET odps.sql.decimal2.extended.scale.enable=false; -- 拡張スケールを無効にします。スケールの範囲: [0, 18]。 EXPLAIN SELECT CAST(1bd AS DECIMAL(10,9))*CAST(1bd AS DECIMAL(11,10)); -- Result: job0 is root job In Job job0: root Tasks: M1 In Task M1: VALUES: _c0 : {1} Statistics: Num rows: 1.0, Data size: 16.0 FS: output: Screen schema: _c0 (decimal(22,18)) Statistics: Num rows: 1.0, Data size: 16.0例 4: DECIMAL256 の場合、精度の範囲は [39, 76] で、スケールの範囲は [0, precision] です。
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; SET odps.sql.decimal256.enable=true; CREATE OR REPLACE TABLE foo_t(a decimal(60,10)); EXPLAIN SELECT * FROM foo_t; -- Result: job0 is root job In Job job0: root Tasks: M1 In Task M1: Data source: ***_project.foo_t TS: muze_project.foo_t Statistics: Num rows: 1.0, Data size: 16.0 FS: output: Screen schema: a (decimal(60,10)) Statistics: Num rows: 1.0, Data size: 16.0例 5: 2 つの標準 DECIMAL 値を乗算した場合、結果はデフォルトで標準 DECIMAL 型になります。結果が範囲を超える場合は切り捨てられます。
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; -- 結果型は、標準 DECIMAL の範囲に収まるように切り捨てられるため、decimal(38,5) になります。 EXPLAIN SELECT CAST(1bd AS DECIMAL(30,5)) * CAST(1bd AS DECIMAL(30,0)); -- Result: job0 is root job In Job job0: root Tasks: M1 In Task M1: VALUES: _c0 : {1} Statistics: Num rows: 1.0, Data size: 16.0 FS: output: Screen schema: _c0 (decimal(38,5)) Statistics: Num rows: 1.0, Data size: 16.0DECIMAL256を有効にし、SET odps.sql.decimal256.auto.promotion=true;を設定して自動型昇格を有効にすると、システムは計算結果をより高精度なDECIMAL256型に自動昇格させ、切り捨てを回避して完全な精度を保持します。SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; SET odps.sql.decimal256.enable=true; SET odps.sql.decimal256.auto.promotion=true; -- 結果型は decimal(61,5) です。2 つの標準 DECIMAL 値の積は DECIMAL256 の範囲に昇格されます。 EXPLAIN SELECT CAST(1bd AS DECIMAL(30,5)) * CAST(1bd AS DECIMAL(30,0)); -- Result: job0 is root job In Job job0: root Tasks: M1 In Task M1: VALUES: _c0 : {1} Statistics: Num rows: 1.0, Data size: 16.0 FS: output: Screen schema: _c0 (decimal(61,5)) Statistics: Num rows: 1.0, Data size: 16.0