このトピックでは、DataWorks を使用して外部テーブルを作成および設定する方法について説明します。 また、外部テーブルでサポートされているデータ型を示します。

概念

次の表に、外部テーブルを使用する前に知っておく必要がある概念を示します。
概念 説明
Object Storage Service (OSS) OSS は、標準、低頻度アクセス、アーカイブなどのストレージクラスをサポートしています。 さまざまなデータストレージシナリオに適用できます。 さらに、OSS は、Hadoop オープンソースコミュニティや、E-MapReduce (EMR)、バッチコンピューティング、MaxCompute、 Machine Learning Platform for AI、Function Compute などの他のプロダクトと密に連携させることができます。
MaxCompute MaxCompute は、効率的で完全に管理されたデータウェアハウジングソリューションです。 OSS と組み合わせて使用すると、大規模なデータを低コストで効果的に分析し処理することができます。
MaxCompute の外部テーブル MaxCompute のコンピューティングフレームワーク V2.0 に基づいて、外部テーブルを使用して、MaxCompute テーブルにデータをロードせずに、OSS で多数のファイルを直接クエリできます。 これにより、データ移行に必要な時間と労力が削減され、ストレージコストが削減されます。
現在、MaxCompute は、OSS や Table Store のテーブルなど、非構造化データを格納する外部テーブルをサポートしています。 非構造化データ処理フレームワークにより、MaxCompute は OSS や Table Store の外部テーブルからデータをインポートおよび外部テーブルにデータをエクスポートできます。 次のセクションでは、処理ロジックを説明する例として、OSS の外部テーブルを取り上げます。
  1. OSS に格納されているデータは、非構造データ処理フレームワークを使って変換され、InputStream Java クラスを使ったユーザー定義のインターフェイスへ送られます。 EXTRACT ロジックのコードを記述する必要があります。つまり、入力ストリームからデータの読み取り、解析、変換、計算をします。 抽出されたデータレコードの形式は、MaxCompute でサポートされている必要があります。
  2. 抽出されたデータレコードは、MaxCompute に組み込まれた SQL 計算エンジンでさらに処理できます。 処理中に、より多くのデータレコードを生成できます。
  3. 作成されたレコードは、ユーザー定義の出力ロジックに渡され、さらに計算と変換が行われます。 最後に、システムは OutputStream Java クラスを使用して、レコード内の必要なデータを OSS にエクスポートします。

DataWorks コンソールの視覚的インターフェイスを使用して、外部テーブルを作成、検索、構成、処理、構成できます。 外部テーブルのデータをクエリ、計算、分析することもできます。 DataWorks は MaxCompute を利用しています。

ネットワークとアクセス権限の付与

MaxCompute は OSS から独立しているため、異なるクラスターでのネットワーク接続は、OSS に格納されているデータへアクセスするための MaxCompute の能力に影響する場合があります。 プライベートエンドポイント (-internal.aliyuncs.com で終わる) を使って、MaxCompute から OSS に格納されているデータへアクセスすることを推奨します。

MaxCompute は、OSS データにアクセスするために安全な承認済みチャネルを必要とします。 MaxCompute は、Alibaba Cloud の Resource Access Management (RAM) および Security Token Service (STS) を使用して、データアクセスのセキュリティを確保します。 MaxCompute は、テーブル作成者としての STS からのデータアクセス権限に適用されます。 Table Store の権限設定は、OSS の権限設定と同じです。
  1. STS 権限付与を実行します。

    OSS データにアクセスするには、MaxCompute ジョブの実行に使用するアカウントに権限付与をする必要があります。 STS は、Alibaba Cloud の RAM サービスによって提供されるトークン管理サービスです。 STS を使用すると、権限のある RAM ユーザーとクラウドサービスは、カスタムの有効性と権限を持つトークンを発行できます。 アプリケーションは、Alibaba Cloud API を呼び出し、リソースを操作することができます。

    次の 2 つの方法のいずれかを使用して、アクセス権限を付与できます。
    • MaxCompute プロジェクトと OSS バケットが同じ Alibaba Cloud アカウントによって所有されている場合は、DataWorks コンソールにログインして権限付与を実行します。
      1. 新しく作成されたテーブルの編集ページを開いて、 [物理モデル] セクションを見つけます。
      2. [テーブルタイプ][外部テーブル] に設定します。
      3. [ストレージアドレス] を設定して、[権限付与] をクリックします。
      4. [クラウドリソースアクセス権限付与] ダイアログボックスで [権限付与ポリシーの確認] をクリックします。
    • MaxCompute に、RAM コンソールで OSS データにアクセスする権限を付与します。
      1. RAM コンソールにログインします。
        MaxCompute と OSS へのログインに異なるアカウントを使用する場合、OSS アカウントを使用して RAM コンソールにログインして次の操作を実行する必要があります。
      2. 左側のナビゲーションウィンドウで、 [RAM ロール] をクリックします。
      3. [RAM ロールの名前][Note] を設定します。
        ロールの名前は、AliyunODPSDefaultRole または AliyunODPSRoleForOtherUser に設定する必要があります。
      4. [信頼できる Alibaba Cloud アカウントの選択] にある [現在の Alibaba Cloud アカウント] または [別の他の Alibaba Cloud アカウント] を選択します。
        [別の Alibaba Cloud アカウント] を選択した場合、アカウント ID を入力する必要があります。
      5. [ロールの詳細] を設定します。
        [RAM ロール] ページで、[RAM ロールの名前] 列にある対象のロールをクリックします。 [信頼できるポリシー管理] タブで、[信頼ポリシーの編集] をクリックし、必要に応じてポリシーを入力します。
        --MaxCompute プロジェクトと OSS バケットが同じアカウントに属している場合は、次のコンテンツを入力します。
        {
        "Statement": [
        {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
        "Service": [
        "odps.aliyuncs.com"
              ]
            }
          }
        ],
        "Version": "1"
        }                                           
        -MaxCompute プロジェクトと OSS バケットが異なるアカウントに属している場合は、次のコンテンツを入力します。
        {
        "Statement": [
        {
        "Action": "sts:AssumeRole",
        "Effect": "Allow",
        "Principal": {
        "Service": [
        "MaxCompute project@odps.aliyuncs.com を所有する Alibaba Cloud アカウントの ID"
              ]
            }
          }
        ],
        "Version": "1"
        }

        設定が完了したら、[OK] をクリックします。

      6. 権限付与ポリシーをロールに関連付けます。 [権限の追加] をクリックし、OSS アクセス権限を付与するために必要な AliyunODPSRolePolicy ポリシーを検索します。 「AliyunODPSRolePolicy」 ポリシーをロールに添付します。 この方法でこのポリシーが見つからない場合は、 [ポリシーを入力] をクリックし、必要な権限をロールに添付します。
        {
          "Version": "1",
          "Statement": [
            {
              "Action": [
                "oss:ListBuckets",
                "oss:GetObject",
                "oss:ListObjects",
                "oss:PutObject",
                "oss:DeleteObject",
                "oss:AbortMultipartUpload",
                "oss:ListParts"
                ],
                "Resource": "*",
                "Effect": "Allow"
          },
          {
              "Action": [
                "ots:ListTable",
                "ots:DescribeTable",
                "ots:GetRow",
                "ots:PutRow",
                "ots:UpdateRow",
                "ots:DeleteRow",
                "ots:GetRange",
                "ots:BatchGetRow",
                "ots:BatchWriteRow",
                "ots:ComputeSplitPointsBySize"
              ],
              "Resource": "*",
              "Effect": "Allow"
            }
          ]
        }
  2. OSS データストアを使用します。

    OSS データストアを作成して保存した場合は、[ワークスペースの管理] > [データソース] のデータストアを表示して使用します。

外部テーブルの作成

  1. データ定義言語 (DDL) を使用して外部テーブルを作成します。

    [データ分析] ページに移動し、DDL 文を使用して外部テーブルを作成します。 DDL 文は、MaxCompute 構文に準拠している必要があります。 STS の権限付与を完了している場合は、DDL 文の odps.properties.rolearn 属性を含める必要はありません。

    次のセクションでは、サンプルの DDL 文を示します。ここでの EXTERNAL は外部テーブルを示します。
    CREATE EXTERNAL TABLE IF NOT EXISTS ambulance_data_csv_external(
    vehicleId int,
    recordId int,
    patientId int,
    calls int,
    locationLatitute double,
    locationLongtitue double,
    recordTime string,
    direction string
    )
    
    STORED BY 'com.aliyun.odps.udf.example.text.TextStorageHandler' --必須。 STORED BY 文は、カスタムストレージハンドラークラスまたは他のファイル形式の名前を指定します。
    with SERDEPROPERTIES (
    'delimiter'='\\|', -- 任意。 The SERDEPROPERITES 句はデータのシリアル化または逆シリアル化をする場合に使用されるパラメーターを指定します。 これらのパラメーターは DataAttributes を介して EXTRACT ロジックにわたすことができます。
    'odps.properties.rolearn'='acs:ram::xxxxxxxxxxxxx:role/aliyunodpsdefaultrole'
    )
    LOCATION 'oss://oss-cn-shanghai-internal.aliyuncs.com/oss-odps-test/Demo/SampleData/CustomTxt/AmbulanceData/'     --必須。 LOCATION パラメーターは、外部テーブルの場所を指定します。
    USING 'odps-udf-example.jar'; -カスタムフォーマットクラスを使用する場合は必須。 USING パラメーターは、カスタムフォーマットクラスが存在する JAR パッケージを指定します。 
    STORED BY の次は、Comma Separated Value (CSV) または Tab Separated Value (TSV) ファイル用に組み込まれたストレージハンドラーを示すパラメーターが続きます。 詳細は以下のとおりです。
    • com.aliyun.odps.CsvStorageHandler テーブルが CSV ファイルとして保存されていることを示します。 この仕様では、列区切り文字はコンマ (,) で、改行文字は \ n です。例:STORED BY'com.aliyun.odps.CsvStorageHandler'
    • com.aliyun.odps.TsvStorageHandler テーブルが TSV ファイルとして保存されていることを示します。 この仕様では、列区切り文字は \ tで、改行文字は \ n です。
    STORED BY の次は、[オープンソースの外部テーブル]、ORC、Parquet、シーケンスファイル、Record Columnar File (RCFile)、Avro、テキストファイルなどにすることができます。 たとえば、 org.apache.hive.hcatalog.data.JsonSerDe クラスを指定して、テーブルをテキストファイルとして保存できます。
    • org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe: テーブルはテキストファイルとして格納されます。
    • org.apache.hadoop.hive.ql.io.orc.OrcSerde: テーブは Optimized Row Columnar (ORC) 形式で格納されます。
    • org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe:テーブルは Parquet 形式で格納されます。
    • org.apache.hadoop.hive.serde2.avro.AvroSerDe:テーブルは Avro 形式で格納されます。
    • org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> テーブルがシーケンスファイルとして格納されます。
    次のセクションでは、オープンソースの外部テーブルを作成するための DDL 文について説明します。
      CREATE EXTERNAL TABLE [IF NOT EXISTS] (<column schemas>)
      [PARTITIONED BY (partition column schemas)]
      [ROW FORMAT SERDE '']
      STORED AS 
      [WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='${roleran}'
      [,'name2'='value2',...]
      ) ]
      LOCATION 'oss://${endpoint}/${bucket}/${userfilePath}/';
    次の表は、 SERDEPROPERTIES 句の属性を示します。
    属性 有効値 デフォルト値 説明
    odps.text.option.gzip.input.enabled true または false false 読み取るファイルが圧縮されているかどうかを示します。
    odps.text.option.gzip.output.enabled true または false false 書き込むファイルが圧縮されているかどうかを示します。
    odps.text.option.header.lines.count N (非負整数) 0 ファイルの最初の N 行をスキップします。
    odps.text.option.null.indicator String Empty string NULL を表す文字列です。
    odps.text.option.ignore.empty.lines true または false true 空白行を無視するかどうかを指定します。
    odps.text.option.encoding UTF-8、UTF-16、または US-ASCII UTF-8 ファイルのエンコーディングです。
    MaxCompute では、組み込み抽出機能を使用して GZIP 形式の CSV および TSV ファイルを読み取ることもできます。 ファイルを GZIP 圧縮するかどうかを選択できます。これによって指定する必要のある属性が決まります。

    LOCATION パラメーターは oss://oss-cn-shanghai-internal.aliyuncs.com/Bucket name/Directory name 形式です。 OSS ディレクトリは、グラフィカルユーザーインターフェイス (GUI) で取得できます。 ディレクトリの横にファイル名を追加する必要はありません。

    DDL 文を使用して作成されたテーブルは、[ワークスペーステーブル] タブのノードツリーにあります。 レベル 1 フォルダーとレベル 2 フォルダーの値を変更して、テーブルの場所を変更できます。

  2. Table Store 結果テーブルを作成します。
    次のセクションでは、Table Store の外部テーブルの作成に使用される文について説明します。
    CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external(
    odps_orderkey bigint,
    odps_orderdate string,
    odps_custkey bigint,
    odps_orderstatus string,
    odps_totalprice double
    )
    STORED BY 'com.aliyun.odps.TableStoreStorageHandler' 
    WITH SERDEPROPERTIES (
    'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey, o_orderstatus,o_totalprice', -- (3)
    'tablestore.table.name'='ots_tpch_orders'
    'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole'
    )
    LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com'; 
    この文のパラメーターは下記のとおりです。
    • com.aliyun.odps.TableStoreStorageHandler は Table Store に格納されたデータを処理するための MaxCompute の組み込みストレージハンドラーを指定します。
    • SERDEPROPERTIES は、パラメーターのオプションを提供します。 TableStoreStorageHandler を使って「tablestore.columns.mapping」と「tablestore.table.name」を指定する必要があります。
      • tablestore.columns.mapping :必須。 このパラメーターは MaxCompute がアクセスする Table Store のテーブルの列を説明します。プライマリキー列とプロパティ列を含みます。 プライマリキー列は、列名の前にコロン (:) で示します。 この例では、プライマリキー列は、 :o_orderkey:o_orderdatee です。 他は、プロパティ列です。

        Table Store は最大 4 つのプライマリキー列をサポートします。 データ型には、STRING、INTEGER、BINARY があります。 最初のプライマリキーはパーティションキーです。 マッピングを指定する際、Table Store にあるテーブルのすべてのプライマリキー列を指定します。 MaxCompute がすべてのプロパティ列を指定する代わりにアクセスするプロパティ列を指定する必要があります。

      • tablestore.table.name: Table Store にアクセスするテーブル名です。 テーブル名が Table Store にない場合、エラーが報告されます。 MaxCompute は Table Store にテーブルを作成しません。
    • LOCATION: Table Store インスタンスの名前とエンドポイントを指定します。
  3. GUI でテーブルを作成します。
    [データ分析] ページに移動し、GUI でテーブルを作成します。 外部テーブルには次の属性が含まれます。
    • 一般
      • テーブル名 (テーブルの作成時に入力)
      • 表示名
      • レベル 1 フォルダーとレベル 2 フォルダー
      • 説明
    • 物理モデル
      • [テーブルタイプ]: [外部テーブル] を選択します。
      • [パーティション化] :Table Store の外部テーブルはパーティション化をサポートしていません。
      • [ストレージアドレス][物理モデル] セクションで、LOCATION パラメーターをストレージアドレスとして入力できます。 または、[クリックして選択] をクリックして、ストレージアドレスを選択します。 [承認] をクリックします。
      • [ストレージフォーマット]: 必要に応じてファイル形式を選択します。 CSV、TSV、ORC、Parquet、シーケンスファイル、RCFile、Avro、テキストファイル、カスタムファイル形式がサポートされています。 カスタムファイル形式を選択する場合、対応するリソースを選択する必要があります。 リソースをコミットすると、DataWorks は含まれているクラス名を自動的に解析し、それらをクラス名ドロップダウンリストに表示します。
      • [Rolearn] :STS 権限付与を完了している場合は、未指定のままにすることができます。
    • SchemaSchema
      パラメーター 説明
      フィールドタイプ MaxCompute 2.0 は、TINYINT、SMALLINT、INT、BIGINT、VARCHAR、STRING 型のフィールドをサポートしています。
      操作 追加、変更、削除操作がサポートされています。
      定義または値の最大長 VARCHAR 型のフィールドの最大長を設定できます。 複雑なデータ型の場合は、定義を入力します。

データ型

次の表は、外部テーブルでサポートされているデータ型を示します。
データ型 新規 説明
TINYINT 必須 1Y、127Y 署名された 8 ビットの整数で、範囲は -128 から 127 です。
SMALLINT 必須 32767S、-100S 署名された 16 ビットの整数で、範囲は -32,768 から 32,767 です。
INT 必須 1000、-15645787 署名された 32 ビットの整数で、範囲は-2~31 から 2~31 - 1 です。
BIGINT 任意 100000000000L、-1L 署名された 64 ビットの整数で、範囲は -2~63 + 1 から 2~63 - 1 です。
FLOAT 必須 なし。 32 ビットのバイナリ浮動小数型です。
DOUBLE 任意 3.1415926 1E+7 8 ビットの倍精度浮動小数点です (64 ビットバイナリ浮動小数点)。
DECIMAL 任意 3.5BD、99999999999.9999999BD 10 進の抽出数値です。 整数部分の範囲は -10〜36 + 1 から 10〜36-1 で、小数部分は小数点以下 10 から 18 桁までの精度があります。
VARCHAR(n) 必須 なし。 可変長文字の文字列で、長さは 1 から 65535 文字です。
STRING 任意 abc、bcd、alibaba 文字列です。 現在、最大長は 8MB です。
BINARY 必須 なし。 バイナリ数値です。 現在、最大長は 8MB です。
DATETIME 任意 DATETIME ‘2017-11-11 00:00:00’ 日時と時間のデータ型です。 UTC-8 はシステムの標準時間として使用されています。 範囲は 0000-01- 01 から 9999-12-31 で、ミリ秒で正確です。
TIMESTAMP 必須 TIMESTAMP ‘2017-11-11 00:00:00.123456789’ TIMESTAMP データ型で、タイムゾーンから独立しています。 範囲は 0000-01-01〜9999-12-31 23.59:59.999,999,999 で、ナノ秒までの精度があります。
BOOLEAN 任意 TRUE 、 FALSE 値は TRUE または FALSE である必要があります。
次の表に、外部テーブルでサポートされる複雑なフィールドタイプを示します。
データ型 説明 コンストラクター
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 2.0 で新しくサポートされるようになったデータタイプ (TINYINT、SMALLINT、INT、FLOAT、VARCHAR、TIMESTAMP、BINARY または複合データ型) を使用する場合、テーブルを作成する文の前に set odps.sql.type.system.odps2=true; を含めます。 テーブル作成の文とともに set 文をコミットします。 Hive との互換性が必要な場合、odps.sql.hive.compatible=true; 文を含めることを推奨します。

外部テーブルの表示と処理

[データ分析] ページに移動して、左側のナビゲーションウィンドウで [ワークスペーステーブル] をクリックして外部テーブルを表示します。 外部テーブルは、内部テーブルと同じ方法で処理されます。