このトピックでは、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, 精度] です。このデータ型を使用するには、次のフラグを設定します。
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]で高精度計算がサポートされています。 -
odps.sql.decimal256.auto.promotion=true;を設定して型の自動プロモーションを有効にした場合:システムは必要に応じて計算結果をより高精度の DECIMAL256 型に自動的に昇格させ、より広範囲の高精度計算をサポートします。
-
-
DECIMAL256:精度の範囲は [39, 76]、スケールの範囲は [0, 精度] です。このデータ型を使用するには、次のフラグを設定します。
SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; SET odps.sql.decimal256.enable=true;
-
odps.sql.decimal256.enable=true が有効になっている場合、odps.sql.type.system.odps2 と odps.sql.decimal.odps2 も true に設定する必要があります。そうでない場合、クエリでエラーが返されます。
注意事項
-
1 つのテーブルに、古い DECIMAL データ型と新しい 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));
-- エラー: 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 enable
DECIMAL 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; -- 結果: +------------------------------------------------------------------------------------+ | 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; -- 結果: +------------------------------------------------------------------------------------+ | 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, 精度] です。スケール範囲が [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)); -- 結果: 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)); -- 結果: 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, 精度] です。
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; -- 結果: 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)); -- 結果: 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)); -- 結果: 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