このトピックでは、Tunnelコマンドの機能と、Tunnelコマンドを使用してデータをアップロードまたはダウンロードする方法について説明します。
サポートされているプラットフォーム
MaxComputeでは、MaxComputeクライアント (odpscmd) とMaxCompute Studioを使用してTunnelコマンドを実行できます。 詳細については、「MaxComputeクライアント (odpscmd) 」および「MaxCompute Studioとは」をご参照ください。
特徴
MaxComputeクライアントは、Dshipツールの機能を実装するTunnelコマンドを提供します。 Tunnelコマンドを使用して、データをアップロードまたはダウンロードできます。 このセクションでは、次のTunnelコマンドの機能について説明します。
UPLOAD: ローカルデータをMaxComputeテーブルにアップロードします。 ファイルは、毎回1つのテーブルまたはテーブル内の1つのパーティションにのみアップロードできます。 パーティションテーブルの場合、データのアップロード先のパーティションを指定する必要があります。 マルチレベルパーティションテーブルの場合は、最低レベルのパーティションを指定する必要があります。 詳細については、「アップロード」をご参照ください。
DOWNLOAD: MaxComputeテーブルデータまたは特定のインスタンスのクエリ結果をローカルディレクトリにダウンロードします。 毎回1つのテーブルまたはパーティションから1つのローカルファイルにデータをダウンロードできます。 パーティションテーブルの場合、データをダウンロードするパーティションを指定する必要があります。 マルチレベルパーティションテーブルの場合、最低レベルのパーティションを指定する必要があります。 詳細については、「ダウンロード」をご参照ください。
RESUME: ネットワークの切断またはトンネルサービスの障害によりエラーが発生した場合、ファイルのアップロードを再開します。
このコマンドを使用してデータのダウンロードを再開することはできません。 詳細については、「再開」をご参照ください。SHOW: 履歴タスク情報を表示します。 詳細については、「表示」をご参照ください。
PURGE: セッションディレクトリをクリアします。 過去3日間のログはデフォルトで削除されます。 詳細については、「パージ」をご参照ください。
HELP: ヘルプ情報を照会します。 コマンドエイリアスがサポートされています。
UPSERT: UPDATEおよびINSERTセマンティクスを使用してデータを書き込みます。 このコマンドは、トランザクションテーブル2.0テーブルにのみデータを書き込むために使用できます。
一致するデータが宛先テーブルに見つからない場合、新しいデータがテーブルに挿入されます。 書き込まれるデータが既に存在する場合、テーブル内のデータが更新される。
Tunnelコマンドの制限
TunnelコマンドとTunnel SDKは外部テーブルには使用できません。 Tunnelを使用して、MaxCompute内部テーブルにデータをアップロードできます。 OSS SDK for Pythonを使用して、データをOSSにアップロードし、そのデータをMaxComputeの外部テーブルにマップすることもできます。 外部テーブルの詳細については、「外部テーブルの概要」をご参照ください。
Tunnelコマンドを実行して、ARRAY、MAP、またはSTRUCTタイプのデータをアップロードまたはダウンロードすることはできません。
サーバーでは、セッションのライフサイクルはセッションが作成されてから24時間後です。 セッションはサーバー上のプロセスとスレッド間で共有できますが、各ブロックIDが一意であることを確認する必要があります。
説明トンネルセッション: サーバーは、アップロードまたはダウンロードタスクのセッションを作成し、アップロードまたはダウンロードタスクを識別するための一意のアップロードIDまたはダウンロードIDを生成します。 サーバー上のトンネルセッションのライフサイクルは24時間です。 24時間後、セッションは利用できなくなります。
セッションごとにデータをダウンロードする場合、Alibaba Cloudアカウントを使用して作成されたセッションのデータのみが、このアカウントまたはそのRAMユーザーによってダウンロードできます。
テーブルデータのアップロードとダウンロード
テーブルデータをアップロードする前に、アップロードするテーブルデータを含むデータファイルdata.txtを取得する必要があります。 保存パスはd:\data.txtです。 次の例は、ファイル内のデータを示しています。
shopx,x_id,100
shopy,y_id,200
shopz,z_iddata.txtファイルのデータの3行目の列数は、次の例で作成されたパーティションテーブルsale_detailの指定された列数とは異なります。 パーティションテーブルsale_detailには3つの列が含まれますが、データの行には2つの列しか含まれません。
テーブルデータをアップロードおよびダウンロードするには、次の手順を実行します。
MaxComputeクライアントで、次のステートメントを実行して、sale_detailという名前のパーティションテーブルを作成し、テーブルにパーティションを追加します。
CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING,region STRING); alter table sale_detail add partition (sale_date='201312', region='hangzhou');UPLOADコマンドを実行して、data.txtファイルをsale_detailテーブルにアップロードします。サンプル文
tunnel upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false;返される結果
Upload session: 20230505xxxxxxxxxxxb0b02dbb6bd Start upload:d:\data.txt Using \r\n to split records Upload in strict schema mode: true Total bytes:42 Split input to 1 blocks 2023-05-05 10:11:35 upload block: '1' ERROR: column mismatch -,expected 3 columns, 2 columns found, please check data or delimiter説明data.txtファイルにダーティデータが含まれているため、データのインポートに失敗します。 システムはセッションIDとエラーメッセージを返します。
次の文を実行して、データのアップロードを確認します。
サンプル文
select * from sale_detail where sale_date='201312';返される結果
ID = 20230505xxxxxxxxxxxvc61z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+説明data.txtファイルにダーティデータが含まれているため、データのインポートに失敗します。 その結果、テーブルは空になります。
SHOWコマンドを実行して、データのアップロードが失敗したセッションのIDを照会します。サンプル文
tunnel show history;返される結果
20230505xxxxxxxxxxxb0b02dbb6bd failed 'upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false'
data.txtファイルの内容を次の情報に変更します。
shopx,x_id,100 shopy,y_id,200RESUMEコマンドを実行して、データのアップロードを再開します。 20230505xxxxxxxxxxxb0b02dbb 6bdは、データアップロードが失敗したセッションのIDです。サンプル文
tunnel resume 20230505xxxxxxxxxxxb0b02dbb6bd --force;返される結果
start resume 20230505xxxxxxxxxxxb0b02dbb6bd Upload session: 20230505xxxxxxxxxxxb0b02dbb6bd Start upload:d:\data.txt Using \r\n to split records Upload in strict schema mode: true Resume 1 blocks 2023-05-05 10:32:39 upload block: '1' 2023-05-05 10:32:40 upload block complete, block id: 1 upload complete, average speed is 0 bytes/s OK
次の文を実行して、データのアップロードを確認します。
サンプル文
select * from sale_detail where sale_date='201312';返される結果
ID = 20230505xxxxxxxxxxxx7afc9qcg +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | shopx | x_id | 100.0 | 201312 | hangzhou| | shopy | y_id | 200.0 | 201312 | hangzhou| +-----------+-------------+-------------+-----------+--------+
DOWNLOADコマンドを実行して、sale_detailテーブルからresult.txtファイルにデータをダウンロードします。説明データのダウンロード先のローカルパスには、次のルールに基づいて名前が付けられます。
MaxComputeクライアントのbinディレクトリにファイルを直接保存できます。 この場合、pathパラメーターを
File name.File name extension形式の値に設定する必要があります。ファイルを別のディレクトリに保存することもできます。 たとえば、ファイルをドライブDのテストフォルダに保存できます。この場合、pathパラメーターを
D:\test\File name.File name extension形式の値に設定する必要があります。ローカルパス内のファイルの名前が保存するファイルと同じ場合、既存のファイルは新しいファイルによって上書きされます。
tunnel download sale_detail/sale_date=201312,region=hangzhou result.txt;result.txtファイルに次の内容が含まれているかどうかを確認します。 ファイルに次のコンテンツが含まれている場合、データのダウンロードは成功します。
説明ダウンロードされたファイルには、非パーティションキー列の値のみが含まれます。
shopx,x_id,100.0 shopy,y_id,200.0
インスタンスのデータをダウンロードする
方法1: Tunnel DOWNLOADコマンドを実行して、特定のインスタンスのクエリ結果をローカルファイルにダウンロードします。
SELECTステートメントを実行して、パーティションテーブルsale_detailを照会します。
select * from sale_detail;説明パーティションテーブルsale_detailのフルテーブルスキャンを無効にすると、
table (xxxx) がすべてのパーティションでフルスキャンです。パーティション述語を指定してくださいというエラーメッセージが表示されます。 詳細については、「SQLエラー (ODPS-01CCCCX) 」をご参照ください。次のコマンドを実行して、クエリ結果をローカルファイルにダウンロードします。
-- View the instance ID in the SELECT statement. show p; -- Run the Tunnel DOWNLOAD command. tunnel download instance://20170724071705393ge3csfb8 result.txt;
方法2: InstanceTunnelを使用してクエリ結果をダウンロードするために必要なパラメーターを設定します。
MaxComputeクライアントで
use_instance_tunnelを有効にした後、InstanceTunnelを使用して、SELECTステートメントによって返されるクエリ結果をダウンロードできます。 これにより、いつでも任意のサイズのクエリ結果をダウンロードできます。 次のいずれかの方法を使用して、この機能を有効にできます。説明InstanceTunnelの制限の詳細については、「制限」をご参照ください。
最新バージョンのMaxComputeクライアントにログインします。 odps_config.iniファイルを見つけ、use_instance_tunnelがtrueに設定され、
instance_tunnel_max_recordが10000に設定されていることを確認します。# download sql results by instance tunnel use_instance_tunnel=true # the max records when download sql results by instance tunnel instance_tunnel_max_record=10000説明instance_tunnel_max_recordパラメーターは、InstanceTunnelを使用してダウンロードできるSQL結果レコードの最大数を指定します。 このパラメーターを指定しない場合、ダウンロードできるクエリ結果の数は無制限です。console.sql.result.instancetunnelをtrueに設定します。InstanceTunnelを有効にします。
set console.sql.result.instancetunnel=true;SELECTステートメントを実行します。
select * from wc_in;次の応答が返されます。
ID = 20170724081946458g14csfb8 Log view: http://logview/xxxxx..... +------------+ | key | +------------+ | slkdfj | | hellp | | apple | | tea | | peach | | apple | | tea | | teaa | +------------+ A total of 8 records fetched by instance tunnel. Max record number: 10000
説明InstanceTunnelを使用すると、クエリ結果の最後にメッセージが表示されます。 メッセージは、SELECTステートメントの実行後にダウンロードされたレコードの総数を示します。 この例では、8つのレコードがダウンロードされる。 この機能を無効にするには、
console.sql.result.instancetunnelをfalseに設定します。