ここでは、MaxCompute 2.0 で使用可能なデータ型を説明します。基本データ型と複合データ型があります。

基本データ型

MaxCompute2.0 が対応しているデータ型を下表に記載します。 MaxCompute のテーブル列は、下表に記載したデータ型のいずれかでなければなりません。 新規データ型は、Tinynt、Smallint、Int、Float、Varchar、Timestamp、および Binary です。データ型の詳細は、次のとおりです。
MaxCompute SQL と新バージョンの Mapreduce で使用可能な set コマンドは、次の 2 通りに分けられます。
  • セッションレベル: 新規データ型 (Tinyint、Smallint、Int、Float、Varchar、Timestamp、Binary) を使用するには、テーブル文の前に、次の set 文を追加する必要があります。
    set odps.sql.type.system.odps2=true;
    次に、テーブル文と一緒に、実行する SQL 文を送信します。SQL ツールでは、デフォルトで MaxCompute Studio を通して自動的に set 文が追加され、実行コマンドが送信されます。
  • 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 の詳細は、「その他の操作

」をご参照ください。
現在、MR タスクは新規データ型に対応していません。
データ型 新規 定数 説明
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 の ブール型です。
上記の表のデータ型は、すべて NULL にすることができます。
  • 注 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)
現在、 MaxCompute SQL および Mapreduce の新バージョンでは、次の 2 通りの方法で set コマンドを使用できます。
  • セッションレベル: 新しいデータ型 (Tinyint、Smallint、Int、Float、Varchar、Timestamp Binary) を使用するには、テーブル文の前に set 文を追加します。
    set odps.sql.type.system.odps2=true;
    次に set 文をテーブル文と一緒に送信します。
  • プロジェクトレベル: プロジェクトレベルの set 文が使用できるようになりました。 プロジェクトオーナーは、必要に応じてプロジェクトを設定できます。
    setproject odps.sql.type.system.odps2=true;

    setproject コマンドの詳細は、「その他の操作」をご参照ください。