ここでは、MaxCompute 2.0 で使用可能なデータ型を説明します。基本データ型と複合データ型があります。
基本データ型
- セッションレベル: 新規データ型 (Tinyint、Smallint、Int、Float、Varchar、Timestamp、Binary) を使用するには、テーブル文の前に、次の
set 文を追加する必要があります。
次に、テーブル文と一緒に、実行する SQL 文を送信します。SQL ツールでは、デフォルトで MaxCompute Studio を通して自動的に set 文が追加され、実行コマンドが送信されます。set odps.sql.type.system.odps2=true;
- Int データ型の場合、set 文に 32 ビットが追加されます。Set 文を追加しない場合は、64 ビットの Bigint 型に変換されます。
- SDK 0.27.2 パブリックバージョン以降、Client 0.27.0 バージョン以降が新規データ型に対応しています。
新規データ型を odps.sql.type.system.odps2
でオープンにします。
- 暗黙的な型変換ルールが変わります。
発生の可能性がある互換性問題: 新規データ型システムでは、いくつかの型変換が無効になります。String → Bigint、String → Datetime、Double → Bigint、Decimal → Double、Decimal → Bigint はすべて、正しく変換されなかったり、エラーが発生する恐れがあります。 このような状況が発生した場合は、キャスト変換によって解決できます。
- サポート対象の操作、組み込み関数、UDF は同じではありません。
操作や組み込み関数で新規データ型をパラメーターや戻り値として使用する場合、使用する前に新規データ型をオープンにする必要があります。新規データ型をパラメーターや戻り値として複数定義する UDF も対象です。 発生の可能性のある互換性問題: たとえば、UDF に Bigint 型と Int 型の 2 つが定義されているとします。 旧タイプの MaxCompute では Bigint 型のオーバーロードでなければなりませんが、新タイプの MaxCompute では Int 型のオーバーロードに解決されることがあります。
- 定数のデータ型が変わります。
123 のような単一定数は、旧タイプの MaxCompute では Bigint 型になり、新タイプの MaxCompute では Int 型になります。 発生の可能性のある互換性問題: Int 型によって、後続操作で呼び出される機能のプロトタイブで不一致が発生します。たとえば、テーブルの削除の後に新データ型のテーブルを作成する (ディスクへの書き込み) などの操作で、周辺ツールやジョブの動作が変わってしまいます。
- Bigint 型キーワードの解決が異なります。
旧タイプのシステムでは、Int 型キーワードは Bigint 型として処理されますが、新タイプのシステムでは真の Int 型として処理されます。 発生の可能性のある互換性問題: Int 型によって、後続操作で呼び出される機能のプロトタイブで不一致が発生します。たとえば、テーブルの削除の後に新データ型のテーブルを作成する (ディスクへの書き込み) などの操作で、周辺ツールやジョブの動作が変わってしまいます。
setproject の詳細は、「その他の操作
」をご参照ください。データ型 | 新規 | 定数 | 説明 |
---|---|---|---|
Tinyint | はい | 1Y、-127Y | 8 ビット符号付き整数で、範囲は -128~127 です。 |
Smallint | はい | 32767S、-100S | 16 ビット符号付き整数で、範囲は -32768~32767 です。 |
Int | はい | 1000、-15645787 (注 2) | 32 ビット符号付き整数で、範囲は -231 から 231 - 1 です。 |
Bigint | いいえ | 100000000000L、-1L | 64 ビット符号付整数で、範囲は -263 + 1 から 263 - 1 です。 |
Float | はい | なし | 32 ビットバイナリ浮動小数点です。 |
Double | いいえ | 3.1415926 1E+7 | 64 ビットバイナリ浮動小数点です。 |
Decimal | いいえ | 3.5BD、99999999999.9999999BD (注 1) | 10 進数の数値型で、整数部分の範囲は -1036 + 1 ~ 1036 - 1 で、小数部分は 10-18 まで正確です。 |
Varchar | はい | なし (注 3) | 可変文字型。n は長さで範囲は 1~65535 です。 |
String | いいえ | “abc”、’bcd’、”alibaba” ‘inc’ (注 4) | 単一文字型で、長さは最大 8Mです。 |
Binary | はい | なし | バイナリ単一文字型で、長さは最大 8Mです。 |
Datetime | いいえ | DATETIME ‘2017-11-11 00:00:00’ | 日付型で、999 年 12 月 31 日から 9,0000 年 1 月 1 日の範囲であり、ミリ秒まで正確です (注 5)。 |
Timestamp | はい | TIMESTAMP ‘2017-11-11 00:00:00.123456789’ | タイムゾーンに依存し、0000 年 1 月 1 日から 9999 年 12 月 31日 23.59:59.999999999 の範囲であり、ナノ秒レベルまで正確です。 |
Boolean | いいえ | TRUE、FALSE | True または False の ブール型です。 |
- 注 1: Decimal 型フィールドに定数を挿入する場合、定数の記述に注意してください。 定数の定義で 3.5BD を挿入する場合の例は、次のとおりです。
insert into test_tb(a) values (3.5BD);
フィールド a は Decimal 型です。
- 注 2: Int 定数では、Int 型の範囲を超えている場合、Int 型は Bigint 型に変換されます。Bigint 型の範囲を超えている場合は、Double
型に変換されます。
MaxCompute 2.0 より前のバージョンでは、SQL スクリプト内のすべての INT 型は、Bigint 型に変換されます。以下に例を示します。
create table a_bigint_table(a int); -- the int here is actually treated as a bigint select cast(id as int) from mytable; -- the int here is actually treated as a bigint
MaxCompute 2.0 はMaxCompute の旧バージョンと互換性があるため、 odps.sql.type.system.odps2 を True と設定しなくても、この変換機能は保持されます。 ただし、Int 型が Bigint 型として処理されると、警告が発生します。 この場合、混乱を避けるために Int 型を Bigint 型に変更することを推奨します。
- 注 3: Varchar 型の定数は、暗黙変換の String 型の定数で表すことができます。
- 注 4: String 型の定数では、連結が行われます。たとえば、
abc
xyz
はabcxyz
として解釈されるので、異なる部分が異なる行に書き込まれることがあります。 - 注 5: 現行のクエリで表示される時間値には、ミリ秒は含まれません。 Tunnel コマンドで、
-dfp
を使用すると、ミリ秒まで指定できます。たとえば、tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS'
と記述します。Tunnel コマンドの詳細は、「Tunnel コマンド」をご参照ください。
複合データ型
MaxCompute2.0 は、下表に記載する複合データ型に対応しています。
データ型 | 定義方法 | 構築方法 |
---|---|---|
Array | array< int >;array< struct< a:int, b:string >> | array(1, 2, 3); array(array(1, 2); array(3, 4)) |
Map | map< string, string >;map< smallint, array< string>> | map(“k1”, “v1”, “k2”, “v2”); map(1S, array(‘a’, ‘b’), 2S, array(‘x’, ‘y)) |
Struct | struct< x:int, y:int>;struct< field1:bigint, field2:array< int>, field3:map< int, int>> | named_struct(‘x’, 1, ‘y’, 2); named_struct(‘field1’, 100L, ‘field2’, array(1, 2), ‘field3’, map(1, 100, 2, 200) |
- セッションレベル: 新しいデータ型 (Tinyint、Smallint、Int、Float、Varchar、Timestamp Binary) を使用するには、テーブル文の前に
set 文を追加します。
次に set 文をテーブル文と一緒に送信します。set odps.sql.type.system.odps2=true;
- プロジェクトレベル: プロジェクトレベルの set 文が使用できるようになりました。 プロジェクトオーナーは、必要に応じてプロジェクトを設定できます。
setproject odps.sql.type.system.odps2=true;
setproject コマンドの詳細は、「その他の操作」をご参照ください。