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

MaxCompute:ローカル環境での PyODPS の使用

最終更新日:Sep 25, 2026

PyODPS は、MaxCompute 向けの Python SDK です。MaxCompute オブジェクトの基本的な操作と DataFrame フレームワークを提供し、DataWorks またはローカル環境で Python を使用してビッグデータの処理と分析を行うことができます。このトピックでは、ローカル環境で PyODPS をインストールし、MaxCompute に接続し、SQL クエリを実行し、DataFrame API を使用する方法について説明します。

前提条件

開始する前に、次の要件を満たしていることを確認してください。

  • Python 3.6 以降がインストールされていること。

  • Alibaba Cloud アカウントと、MaxCompute プロジェクトに接続するためのアクセスキーをお持ちであること。RAM ユーザーのアクセスキーを使用することを推奨します。

PyODPS のインストール

  1. PyODPS のインストール

    • Linux/macOS:

      pip3 install pyodps
    • Windows:

      pip install pyodps

    numpy や pyarrow などの依存関係をインストールする際に C コードのコンパイルエラーが発生した場合、pip または setuptools のバージョンが古い可能性があります。これらをアップグレードして、インストールを再試行してください。

    # Linux/macOS
    pip3 install -U pip setuptools
    
    # Windows
    pip install -U pip setuptools
  2. インストールの確認

    • Linux/macOS:

      python3 -c "from odps import ODPS"
    • Windows:

      python -c "from odps import ODPS"

      エラーが表示されなければ、インストールは成功です。エラーが発生した場合は、「トラブルシューティング」をご参照ください。

環境変数の設定

認証情報をコードにハードコーディングすることを避けるため、環境変数として設定します。

[RAM コンソール] にログインし、アクセスキー ID とシークレットアクセスキーをコピーしてから、お使いのオペレーティングシステムに基づいて設定します。例として、macOS (zsh) の場合:

  1. macOS (zsh):

    vim ~/.zshrc
  2. 次の行を追加し、プレースホルダーを実際の値に置き換えてください

    export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-AccessKey-ID>
    export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-AccessKey-secret>
  3. 設定の適用

    source ~/.zshrc
  4. 環境変数が設定されていることを確認

    echo $ALIBABA_CLOUD_ACCESS_KEY_ID
    echo $ALIBABA_CLOUD_ACCESS_KEY_SECRET

    各コマンドは対応する値を出力します。出力が空の場合は、ステップ 2 と 3 を繰り返してください。

Linux、macOS、Windows で環境変数を設定する方法の詳細については、「Alibaba Cloud のアクセスキーを環境変数に設定する」をご参照ください。

ODPS エントリーポイントの初期化

ODPS クラスは、すべての PyODPS 操作のエントリポイントです。他の API を呼び出す前に、認証情報とプロジェクト情報で初期化する必要があります。

コードを実行する前に、ALIBABA_CLOUD_ACCESS_KEY_ID と ALIBABA_CLOUD_ACCESS_KEY_SECRET の環境変数が設定されていることを確認してください。 アクセスキーを明示的に指定することもできますが、ソースコードに認証情報をハードコーディングするとセキュリティリスクが生じるため、この方法は推奨されません。

アクセスキー ID とシークレットアクセスキーを取得するには、「アクセスキー ID とシークレットアクセスキーの取得」をご参照ください。

手動での定義

次のコードは、ODPS エントリーポイントを手動で定義する方法を示しています。

  • 推奨 (環境変数を使用)

    import os
    from odps import ODPS
    
    o = ODPS(
        access_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        secret_access_key=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
  • 非推奨 (テスト目的でのみ明示的に指定)

    import os
    from odps import ODPS
    
    o = ODPS(
        access_id='your-aliyun-access-key-id',
        secret_access_key='your-aliyun-access-key-secret',
        project='your-default-project',
        endpoint='your-end-point',
    )
    

STS セキュリティ認証情報の使用

STS セキュリティ認証情報を使用して ODPS にアクセスする場合は、次のように ODPS エントリーポイントオブジェクトを初期化します。

import os
from odps import ODPS
from odps.accounts import StsAccount
# ALIBABA_CLOUD_ACCESS_KEY_ID 環境変数にアクセスキー ID が設定されていること、
# ALIBABA_CLOUD_ACCESS_KEY_SECRET 環境変数にシークレットアクセスキーが設定されていること、
# そして ALIBABA_CLOUD_STS_TOKEN 環境変数に STS トークンが設定されていることを確認してください。
# セキュリティのため、アクセスキー ID やシークレットアクセスキーのハードコーディングは避けてください。
account = StsAccount(
    os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
    os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
    os.getenv('ALIBABA_CLOUD_STS_TOKEN'),
)
o = ODPS(
    account=account,
    project='**your-default-project**',
    endpoint='**your-end-point**',
)

パラメーター

説明

your-default-project

MaxCompute プロジェクトの名前です。[MaxCompute コンソール] にログインして、プロジェクトのリストを確認できます。

your-end-point

お使いのリージョンとネットワーク環境に対応するエンドポイントです。エンドポイントのリストについては、「エンドポイント」をご参照ください。

たとえば、中国 (杭州) リージョンのパブリックネットワークのエンドポイントは https://service.cn-hangzhou.maxcompute.aliyun.com/api です。

これらの設定が完了すると、ローカル環境で PyODPS を使用できるようになります。詳細については、「基本操作の概要」をご参照ください。

データ処理

SQL

MaxCompute は、従来モードと MaxCompute Query Acceleration (MaxQA) モードの 2 つの SQL 実行モードをサポートしています。どちらのモードも DDL および DML ステートメントをサポートしています。MaxQA はジョブの結果をキャッシュし、キャッシュされた結果を返すことで、繰り返し実行されるクエリを高速化します。課金ルールの詳細については、コンピューティングコスト (従量課金)をご参照ください。

execute_sql() および run_sql() メソッドは、DDL 文および DML 文のみをサポートします。他の種類の文については、専用のメソッドを使用してください。たとえば、CREATE TABLE 文には create_table() メソッドを使用し、API コマンドには run_xflow() または execute_xflow() メソッドを使用します。

従来モード

execute_sql() を使用して SQL ステートメントを実行し、open_reader() を使用して結果を読み取ります。

# 専用のメソッドを使用してテーブルを作成
o.create_table('my_t', 'num bigint, id string', if_not_exists=True)

# SELECT クエリを実行
result = o.execute_sql('SELECT * FROM pyodps_iris LIMIT 3')
with result.open_reader() as reader:
    for record in reader:
        print(record)

MaxQA モード

MaxCompute Query Acceleration (MaxQA) は、専用のリソースプールを使用して中小規模のデータに対するクエリを高速化する MaxCompute の機能です。PyODPS v0.11.4.1 以降では、execute_sql_interactive を使用して MaxQA を通じて SQL クエリを実行できます。

o.execute_sql_interactive('SELECT * FROM dual', fallback='all')

MaxQA が SQL ステートメントを実行できない場合、システムは自動的に従来モードにフォールバックします。このフォールバックを無効にするには、fallback パラメーターを False に設定します。また、フォールバックポリシーをコンマ区切りの文字列として指定することもできます:

フォールバックポリシー

説明

generic

不明なエラーが発生した場合に従来モードにフォールバックします。

noresource

リソースが不足している場合に従来モードにフォールバックします。

upgrading

システムアップグレード中に従来モードにフォールバックします。

timeout

タイムアウトが発生した場合に従来モードにフォールバックします。

unsupported

サポートされていないシナリオの場合に従来モードにフォールバックします。

デフォルトポリシーは unsupported,upgrading,noresource,timeout です。フォールバックを常に有効にするには、generic,unsupported,upgrading,noresource,timeout のエイリアスである all に設定します。

# リソースが不足している場合、またはシナリオがサポートされていない場合にのみフォールバック
o.execute_sql_interactive('SELECT * FROM dual', fallback="noresource,unsupported")

PyODPS での SQL 操作の詳細については、「SQL」をご参照ください。

DataFrame

PyODPS は、データ処理のための DataFrame API を提供します。

pandas とは異なり、PyODPS DataFrame は遅延評価されます。これは、execute() や persist() などの即時実行メソッドを呼び出した場合にのみ、計算が実行されることを意味します。

from odps.df import DataFrame

# pyodps_iris テーブルを DataFrame に読み込む
iris = DataFrame(o.get_table('pyodps_iris'))

# 行をフィルタリングして結果を出力する。 .execute() メソッドが実際の計算をトリガーする。
for record in iris[iris.sepalwidth < 3].execute():
    print(record)

デフォルトでは、ローカルで実行される PyODPS は Logview のような詳細なログを出力しません。詳細な出力を有効にするには、次のように設定します:

from odps import options
options.verbose = True

ランタイムパラメーター (ヒント)

SQL 呼び出しに hints ディクショナリを渡すことで、単一のクエリのランタイムパラメータを設定できます:

o.execute_sql('SELECT * FROM pyodps_iris', hints={'odps.sql.mapper.split.size': 16})

セッション内のすべての SQL 呼び出しにヒントを適用するには、グローバルに設定してください。

from odps import options

# これ以降のすべての execute_sql() 呼び出しに、これらのヒントが自動的に含まれます
options.sql.settings = {'odps.sql.mapper.split.size': 16}
o.execute_sql('SELECT * FROM pyodps_iris')

完全な例

次の例では、MaxCompute への接続、テーブルの作成、データの書き込み、データの読み取り、my_new_table テーブルへのクエリ、リソースのクリーンアップという一連のプロセスを示します。

この例では、最後に table.drop() を呼び出し、my_new_table テーブルを完全に削除します。データ損失を避けるため、既存のテーブル名は使用しないでください。このスクリプトはテーブルを削除します。このスクリプトで作成したテーブルを保持したい場合は、最後の table.drop() 呼び出しを削除してください。

  1. test-pyodps-local.py という名前のローカルファイルを作成します。

  2. 次のコードを追加してください:

    import os
    from odps import ODPS
    
    o = ODPS(
        access_id=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID'),
        secret_access_key=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
        project='your-default-project',
        endpoint='your-end-point',
    )
    
    table = o.create_table('my_new_table', 'num bigint, id string', if_not_exists=True)
    
    records = [[111, 'aaa'],
               [222, 'bbb'],
               [333, 'ccc'],
               [444, 'non_ascii_text']]
    o.write_table(table, records)
    
    # レコードを読み取る
    for record in o.read_table(table):
        print(record[0], record[1])
    
     # SQL を使用して my_new_table テーブルにクエリを実行
    result = o.execute_sql('SELECT * FROM my_new_table;')
    
    
    print('Read data from my_new_table using open_reader:')
    
    # クエリ結果を出力
    with result.open_reader() as reader:
        for record in reader:
            print(record[0], record[1])
    
    # テーブルを削除してリソースを解放
    table.drop()
  3. スクリプトの実行

    python test-pyodps-local.py

    期待される出力:

    111 aaa
    222 bbb
    333 ccc
    444 non_ascii_text
    Read data from my_new_table using open_reader:
    111 aaa
    222 bbb
    333 ccc
    444 non_ascii_text

トラブルシューティング

依存関係のインストールエラー

  • 現象: numpy や pyarrow などの依存関係をインストールする際に、C コードのコンパイルエラーが発生します。

  • 原因: pip または setuptools のバージョンが古いためです。

  • 解決策: pip と setuptools をアップグレードしてから、PyODPS を再インストールしてください:

    # Linux/macOS
    pip3 install -U pip setuptools
    
    # Windows
    pip install -U pip setuptools

複数の Python バージョン間での pip バージョンの競合

  • 現象: 間違ったバージョンの Python に PyODPS がインストールされます。

  • 原因:システムに複数の Python バージョンが存在し、pip3 が意図したものとは異なるバージョンを指しているためです。

  • 解決策: 使用したい特定の Python 実行可能ファイルを通じて pip を呼び出してください:

    /home/tops/bin/python3.7 -m pip install pyodps

    /home/tops/bin/python3.7 を目的の Python のインストールパスに置き換えます。

urllib3 の OpenSSL バージョンエラー

  • 症状: urllib3 v2.0 only supports OpenSSL 1.1.1+ というエラーメッセージが表示され、インストールに失敗します。

  • 原因: Python のインストール環境が、urllib3 v2.0 と互換性のない古いバージョンの OpenSSL を使用しているためです。

  • 解決策: PyODPS をインストールする前に、古いバージョンの urllib3 をインストールしてください:

    # Linux/macOS
    pip3 install "urllib3<2.0"
    
    # Windows
    pip install "urllib3<2.0"