このトピックでは、DataWorks で外部テーブルを作成および構成する方法について説明し、外部テーブルがサポートするデータ型を一覧表示します。
概要
外部テーブルを使用する前に、次の表で説明する概念を理解してください。
|
パラメーター |
説明 |
|
Object Storage Service (OSS) |
Object Storage Service (OSS) は、標準、低頻度アクセス、アーカイブのストレージクラスを提供し、さまざまなストレージシナリオに対応します。OSS は、オープンソースの Hadoop コミュニティや、E-MapReduce (EMR)、Batch Compute、MaxCompute、Machine Learning Platform for AI (PAI)、Function Compute などの他のプロダクトと統合されています。 |
|
MaxCompute |
MaxCompute は、高速でフルマネージドなデータウェアハウジングソリューションです。MaxCompute を OSS と統合することで、大量のデータを効率的かつコスト効果の高い方法で分析および処理できます。 |
|
MaxCompute 外部テーブル |
MaxCompute V2.0 計算エンジンを搭載した外部テーブルを使用すると、データを MaxCompute テーブルにロードすることなく、OSS 内の大量のファイルを直接クエリできます。これにより、データ移行の時間と労力が削減され、ストレージコストが節約されます。 |
外部テーブルの全体的な処理アーキテクチャを次の図に示します。
MaxCompute は、OSS や Tablestore などの非構造化ストレージサービスのデータ用の外部テーブルの作成をサポートしています。非構造化処理フレームワークは、MaxCompute プラットフォームのデータインポートとエクスポートを処理します。OSS 外部テーブルを例に、処理ロジックを以下に示します。
-
非構造化フレームワークは、外部の OSS データを変換し、Java の
InputStreamクラスを介してカスタムコードに提供します。EXTRACT ロジックを実装して、InputStreamからの入力を読み取り、解析、変換、計算し、MaxCompute が処理できる汎用のRecordフォーマットでデータを返すことができます。 -
これらのレコードは、MaxCompute の SQL ロジックを使用して処理できます。この計算は、MaxCompute の組み込みの構造化 SQL エンジンに基づいており、新しいレコードを生成する場合があります。
-
システムは、処理されたレコードをカスタムの OUTPUT ロジックに渡して、さらに変換します。その後、システムが提供する
OutputStreamを使用して、レコードから必要な情報を OSS に書き込むことができます。
DataWorks を MaxCompute と一緒に使用して、外部テーブルの作成、検索、クエリ、構成、処理、分析など、さまざまな操作を視覚的に実行できます。
ネットワークとアクセス権限
MaxCompute と OSS は 2 つの独立したサービスであるため、それらのデプロイメントクラスター間のネットワーク接続が、MaxCompute の OSS データへのアクセス能力に影響を与える可能性があります。MaxCompute から OSS データにアクセスする場合は、-internal.aliyuncs.com で終わるホストアドレスである OSS 内部エンドポイントを使用します。
MaxCompute が OSS データにアクセスするには、安全な権限付与チャンネルが必要です。MaxCompute は、Alibaba Cloud の Resource Access Management (RAM) と Security Token Service (STS) を使用して、安全なデータアクセスを保証します。権限をリクエストする際、MaxCompute はテーブル作成者の ID で STS に権限を申請します。Tablestore の権限設定は OSS と同じです。
-
STS 権限付与
OSS データにアクセスするには、MaxCompute のアクセスアカウントに適切な権限を割り当てる必要があります。STS は、RAM が提供する安全なトークン管理サービスです。これにより、権限を与えられたクラウドサービスまたは RAM ユーザーが、カスタムの有効期間と権限を持つ一時的なアクセストークンを発行できます。これらのトークンを取得したアプリケーションは、Alibaba Cloud API を呼び出してリソースにアクセスできます。
権限は、次の 2 つの方法のいずれかで付与できます。
-
MaxCompute プロジェクトと OSS バケットが同じ Alibaba Cloud アカウントに属している場合は、アカウントでログインした後にワンクリック認可を実行できます。
-
新しいテーブルのエディターページを開き、Physical Model セクションに移動します。
-
Table Type で、External Table を選択します。
-
Storage Address の横にある Authorize をクリックします。その後、もう一度 [認可] をクリックします。
-
[クラウドリソースアクセス認可] ダイアログボックスで、同意権限 をクリックします。認可ページで、ODPS サービスが OSS および Tablestore リソースにアクセスするために使用する AliyunODPSDefaultRole ロールを選択します。その後、[認可の確認] をクリックします。
-
-
カスタム権限付与を使用して、RAM コンソールで MaxCompute に OSS へのアクセスを許可します。
-
RAM コンソールにログインします。
説明MaxCompute と OSS が異なるアカウントに属している場合は、OSS アカウントでログインして権限を付与します。
-
左側のナビゲーションウィンドウで、を選択します。
-
[ロールの作成] をクリックし、信頼できるエンティティとして Alibaba Cloud Account を選択し、Next をクリックします。
-
ロール名 と Remarks を入力します。
説明ロール名を AliyunODPSDefaultRole または AliyunODPSRoleForOtherUser に設定します。
-
[信頼できる Alibaba Cloud アカウントの選択] で、Current Alibaba Cloud Account または Another Alibaba Cloud Account を選択します。
説明Another Alibaba Cloud Account を選択した場合は、他のアカウントの ID を入力する必要があります。
- [OK] をクリックします。
-
ロールの詳細を構成します。
ロール管理ページで、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 プロジェクトを所有する Alibaba Cloud アカウントの ID@odps.aliyuncs.com" ] } } ], "Version": "1" }構成が完了したら、[信頼ポリシーの保存] をクリックします。
-
ロールの権限付与ポリシーを構成します。ロールが OSS にアクセスするために必要な 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" }, { "Action": [ "pvtz:DescribeRegions", "pvtz:DescribeZones", "pvtz:DescribeZoneInfo", "pvtz:DescribeVpcs", "pvtz:DescribeZoneRecords" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "dlf:CreateFunction", "dlf:BatchGetPartitions", "dlf:ListDatabases", "dlf:CreateLock", "dlf:UpdateFunction", "dlf:BatchUpdateTables", "dlf:DeleteTableVersion", "dlf:UpdatePartitionColumnStatistics", "dlf:ListPartitions", "dlf:DeletePartitionColumnStatistics", "dlf:BatchUpdatePartitions", "dlf:GetPartition", "dlf:BatchDeleteTableVersions", "dlf:ListFunctions", "dlf:DeleteTable", "dlf:GetTableVersion", "dlf:AbortLock", "dlf:GetTable", "dlf:BatchDeleteTables", "dlf:RenameTable", "dlf:RefreshLock", "dlf:DeletePartition", "dlf:UnLock", "dlf:GetLock", "dlf:GetDatabase", "dlf:GetFunction", "dlf:BatchCreatePartitions", "dlf:ListPartitionNames", "dlf:RenamePartition", "dlf:CreateTable", "dlf:BatchCreateTables", "dlf:UpdateTableColumnStatistics", "dlf:ListTableNames", "dlf:UpdateDatabase", "dlf:GetTableColumnStatistics", "dlf:ListFunctionNames", "dlf:ListPartitionsByFilter", "dlf:GetPartitionColumnStatistics", "dlf:CreatePartition", "dlf:CreateDatabase", "dlf:DeleteTableColumnStatistics", "dlf:ListTableVersions", "dlf:BatchDeletePartitions", "dlf:ListCatalogs", "dlf:UpdateTable", "dlf:ListTables", "dlf:DeleteDatabase", "dlf:BatchGetTables", "dlf:DeleteFunction" ], "Resource": "*", "Effect": "Allow" } ] }
-
-
-
OSS データソースの使用
OSS データソースを作成して保存している場合は、ワークスペースリスト ページでワークスペースを見つけ、Management 列の 操作 をクリックし、Data Source ページでデータソースを表示して使用します。
外部テーブルの作成
-
DDL 文を使用したテーブルの作成
Data Studio ページに移動します。DDL 文を使用してテーブルを作成する方法の詳細については、「MaxCompute テーブルの作成と使用」をご参照ください。標準の MaxCompute 構文に従うだけで済みます。STS サービスの権限付与に成功した場合、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 句は、カスタム StorageHandler クラスの名前または外部テーブルの別のファイル形式を指定します。 with SERDEPROPERTIES ( 'delimiter'='\\|', -- オプション。SERDEPROPERTIES 句は、データのシリアル化とデシリアル化に使用されるパラメーターを指定します。これらのパラメーターは、DataAttributes を介して Extractor ロジックに渡すことができます。 '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'; -- カスタムフォーマットを使用する場合、クラス定義を含む JAR パッケージを指定します。カスタムフォーマットを使用しない場合、この句は必須ではありません。STORED BY 句の後には、CSV または TSV ファイルのデフォルトの組み込み StorageHandler を指定するパラメーターが続きます。パラメーターは以下のとおりです。
-
CSV:
com.aliyun.odps.CsvStorageHandler。このハンドラは、CSV 形式のデータの読み取りと書き込み方法を定義します。規則として、列区切り文字はカンマ (,)、改行は改行文字 (\n) です。例:STORED BY 'com.aliyun.odps.CsvStorageHandler'。 -
TSV:
com.aliyun.odps.TsvStorageHandler。このハンドラは、TSV 形式のデータの読み取りと書き込み方法を定義します。規則として、列区切り文字はタブ (\t)、改行は改行文字 (\n) です。
STORED BY 句は、ORC、PARQUET、SEQUENCEFILE、RCFILE、AVRO、TEXTFILE などのオープンソースフォーマットの外部テーブルもサポートしています。TEXTFILE の場合、
org.apache.hive.hcatalog.data.JsonSerDeなどのシリアル化クラスを指定できます。-
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as textfile
-
org.apache.hadoop.hive.ql.io.orc.OrcSerde -> stored as orc
-
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe -> stored as parquet
-
org.apache.hadoop.hive.serde2.avro.AvroSerDe -> stored as avro
-
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe -> stored as sequencefile
次の 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}/';次の表に、SerDe プロパティを示します。
パラメーター
値
デフォルト
説明
odps.text.option.gzip.input.enabled
true/false
false
読み取り圧縮を有効または無効にします。
odps.text.option.gzip.output.enabled
true/false
false
書き込み圧縮を有効または無効にします。
odps.text.option.header.lines.count
非負の整数
0
テキストファイルのヘッダーの最初の N 行をスキップします。
odps.text.option.null.indicator
文字列
空の文字列
解析または書き込み時に NULL 値を表す文字列。
odps.text.option.ignore.empty.lines
true/false
true
空行を無視するかどうかを指定します。
odps.text.option.encoding
UTF-8/UTF-16/US-ASCII
UTF-8
テキストの文字コードを指定します。
-
MaxCompute は、組み込みエクストラクターを使用して、OSS からの gzip 圧縮された CSV または TSV データのみの読み取りをサポートします。ファイルが gzip 圧縮されているかどうかを選択でき、それによって設定する必要があるプロパティが決まります。
LOCATION パラメーターのフォーマットは oss://oss-cn-shanghai-internal.aliyuncs.com/BucketName/DirectoryName です。GUI ダイアログボックスで OSS ディレクトリのアドレスを選択できます。ディレクトリの後にファイル名を追加する必要はありません。
DDL モードで作成されたテーブルは、テーブル管理のテーブルノードツリーに表示されます。第 1 レベルと第 2 レベルのテーマを変更することで、表示位置を変更できます。
Tablestore 外部テーブル
次の文を使用して、Tablestore 外部テーブルを作成します。
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 は、Tablestore データを処理するための MaxCompute の組み込み StorageHandler です。
-
SERDEPROPERTIES 句は、パラメーターオプションを指定します。TableStoreStorageHandler を使用する場合、tablestore.columns.mapping と tablestore.table.name の 2 つのオプションを指定する必要があります。
-
tablestore.columns.mapping: MaxCompute がアクセスする Tablestore テーブルの列を記述する必須のオプションです。これには、プライマリキーと属性が含まれます。コロン (:) プレフィックスは、Tablestore のプライマリキーを示します。たとえば、この文では、
:o_orderkeyと:o_orderdateがプライマリキーで、その他は属性列です。Tablestore は、STRING、INTEGER、または BINARY 型の 1〜4 つのプライマリキーをサポートします。最初のプライマリキーはパーティションキーです。マッピングを指定する際には、指定された Tablestore テーブルのすべてのプライマリキーを提供する必要があります。属性列については、MaxCompute がアクセスする必要のある列のみを提供する必要があります。
-
tablestore.table.name: アクセスする Tablestore テーブルの名前。指定されたテーブル名が正しくないか、存在しない場合、MaxCompute はエラーを報告します。MaxCompute は Tablestore テーブルを自動的に作成しません。
-
-
LOCATION: Tablestore インスタンス名、エンドポイント、およびその他の詳細を指定します。
GUI でのテーブルの作成
Data Studio ページに移動し、GUI でテーブルを作成します。詳細については、「MaxCompute テーブルの作成と使用」をご参照ください。外部テーブルには次のプロパティがあります。
-
General
-
英語のテーブル名 (Create Table で入力)
-
表示名
-
第 1 レベルのテーマと第 2 レベルのテーマ
-
説明
-
-
Physical Model
-
Table Type: External Table を選択します。
-
Partition Type: Tablestore 外部テーブルではパーティション分割はサポートされていません。
-
Storage Address: これは LOCATION パラメーターに対応します。Physical Model セクションで LOCATION パラメーターを設定できます。Select をクリックしてストレージの場所を選択します。選択後、Authorize をクリックします。
-
[ファイル形式]: ビジネス要件に基づいてフォーマットを選択します。サポートされているフォーマットには、CSV、TSV、ORC、PARQUET、SEQUENCEFILE、RCFILE、AVRO、TEXTFILE、およびカスタムファイル形式が含まれます。カスタムファイル形式を選択した場合は、カスタムリソースを選択する必要があります。リソースを送信すると、それに含まれるクラス名が自動的に解析され、選択可能になります。
-
rolearn: STS 権限付与が完了している場合、このパラメーターは空のままにできます。
-
-
Schema: [スキーマ] セクションで、次のフィールドを追加します:
age(BIGINT, 年齢)、job(STRING, 職業)、marital(STRING, 婚姻状況)、education(STRING, 学歴)、default(STRING, クレジットカードの状況)。これらのフィールドはいずれもプライマリキーではありません。パラメーター
説明
Field Type
MaxCompute 2.0 は、さまざまな基本データ型および複合データ型をサポートしています。
操作
フィールドの追加、変更、削除をサポートします。
Definition or Maximum Value Length
VARCHAR 型の場合、長さを設定できます。複合データ型の場合、型定義を直接入力できます。
サポートされるデータ型
次の表に、外部テーブルがサポートする基本データ型を示します。
|
型 |
新規 |
例 |
説明 |
|
TINYINT |
はい |
1Y, -127Y |
8 ビットの符号付き整数。値の範囲は -128 から 127 です。 |
|
SMALLINT |
はい |
32767S, -100S |
16 ビットの符号付き整数。値の範囲は -32,768 から 32,767 です。 |
|
INT |
はい |
1000, -15645787 |
32 ビットの符号付き整数。値の範囲は -231 から 231-1 です。 |
|
BIGINT |
いいえ |
100000000000L, -1L |
64 ビットの符号付き整数。値の範囲は -263 から 263-1 です。 |
|
FLOAT |
はい |
N/A |
32 ビットのバイナリ浮動小数点数。 |
|
DOUBLE |
いいえ |
3.1415926 1E+7 |
8 バイト、倍精度、64 ビットのバイナリ浮動小数点数。 |
|
DECIMAL |
いいえ |
3.5BD, 99999999999.9999999BD |
10 進数の厳密な数値型。整数部の範囲は -1036+1 から 1036-1 で、小数部は 10-18 桁まで正確です。 |
|
VARCHAR(n) |
はい |
N/A |
可変長文字型。n は長さです。n の値の範囲は 1 から 65,535 です。 |
|
STRING |
いいえ |
"abc", 'bcd', "alibaba" |
文字列型。最大長は 8 MB です。 |
|
BINARY |
はい |
N/A |
バイナリデータ型。最大長は 8 MB です。 |
|
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' |
タイムゾーンに依存しないタイムスタンプ型。値の範囲は 0000-01-01 00:00:00.000000000 から 9999-12-31 23:59:59.999999999 で、ナノ秒単位で正確です。 |
|
BOOLEAN |
いいえ |
TRUE と FALSE |
BOOLEAN 型。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 互換性のためには、set odps.sql.hive.compatible=true; という文を追加します。
外部テーブルの表示と管理
Data Studio ページに移動し、左側のナビゲーションウィンドウで Table Management をクリックして外部テーブルをクエリできます。詳細については、「テーブル管理」をご参照ください。外部テーブルの管理は、内部テーブルの管理と似ています。