すべてのプロダクト
Search
ドキュメントセンター

MaxCompute:使用上の注意

最終更新日:Jan 08, 2025

このトピックでは、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_id
説明

data.txtファイルのデータの3行目の列数は、次の例で作成されたパーティションテーブルsale_detailの指定された列数とは異なります。 パーティションテーブルsale_detailには3つの列が含まれますが、データの行には2つの列しか含まれません。

テーブルデータをアップロードおよびダウンロードするには、次の手順を実行します。

  1. 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');
  2. 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とエラーメッセージを返します。

  3. 次の文を実行して、データのアップロードを確認します。

    • サンプル文

      select * from sale_detail where sale_date='201312';
    • 返される結果

      ID = 20230505xxxxxxxxxxxvc61z5
      +-----------+-------------+-------------+-----------+--------+
      | shop_name | customer_id | total_price | sale_date | region |
      +-----------+-------------+-------------+-----------+--------+
      +-----------+-------------+-------------+-----------+--------+
      説明

      data.txtファイルにダーティデータが含まれているため、データのインポートに失敗します。 その結果、テーブルは空になります。

  4. SHOWコマンドを実行して、データのアップロードが失敗したセッションのIDを照会します。

    • サンプル文

      tunnel show history;
    • 返される結果

      20230505xxxxxxxxxxxb0b02dbb6bd  failed  'upload d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false'
  5. data.txtファイルの内容を次の情報に変更します。

    shopx,x_id,100
    shopy,y_id,200
  6. RESUMEコマンドを実行して、データのアップロードを再開します。 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
  7. 次の文を実行して、データのアップロードを確認します。

    • サンプル文

      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|
       +-----------+-------------+-------------+-----------+--------+
  8. 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;
  9. result.txtファイルに次の内容が含まれているかどうかを確認します。 ファイルに次のコンテンツが含まれている場合、データのダウンロードは成功します。

    説明

    ダウンロードされたファイルには、非パーティションキー列の値のみが含まれます。

    shopx,x_id,100.0
    shopy,y_id,200.0

インスタンスのデータをダウンロードする

  • 方法1: Tunnel DOWNLOADコマンドを実行して、特定のインスタンスのクエリ結果をローカルファイルにダウンロードします。

    1. SELECTステートメントを実行して、パーティションテーブルsale_detailを照会します。

      select * from sale_detail;
      説明

      パーティションテーブルsale_detailのフルテーブルスキャンを無効にすると、table (xxxx) がすべてのパーティションでフルスキャンです。パーティション述語を指定してくださいというエラーメッセージが表示されます。 詳細については、「SQLエラー (ODPS-01CCCCX) 」をご参照ください。

    2. 次のコマンドを実行して、クエリ結果をローカルファイルにダウンロードします。

      -- 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に設定します。