PyODPS は、MaxCompute 向けの Python SDK です。MaxCompute オブジェクトの基本的な操作と DataFrame フレームワークを提供し、DataWorks またはローカル環境で Python を使用してビッグデータの処理と分析を行うことができます。このトピックでは、ローカル環境で PyODPS をインストールし、MaxCompute に接続し、SQL クエリを実行し、DataFrame API を使用する方法について説明します。
前提条件
開始する前に、次の要件を満たしていることを確認してください。
Python 3.6 以降がインストールされていること。
Alibaba Cloud アカウントと、MaxCompute プロジェクトに接続するためのアクセスキーをお持ちであること。RAM ユーザーのアクセスキーを使用することを推奨します。
PyODPS のインストール
PyODPS のインストール
Linux/macOS:
pip3 install pyodpsWindows:
pip install pyodps
numpy や pyarrow などの依存関係をインストールする際に C コードのコンパイルエラーが発生した場合、pip または setuptools のバージョンが古い可能性があります。これらをアップグレードして、インストールを再試行してください。
# Linux/macOS pip3 install -U pip setuptools # Windows pip install -U pip setuptoolsインストールの確認
Linux/macOS:
python3 -c "from odps import ODPS"Windows:
python -c "from odps import ODPS"エラーが表示されなければ、インストールは成功です。エラーが発生した場合は、「トラブルシューティング」をご参照ください。
環境変数の設定
認証情報をコードにハードコーディングすることを避けるため、環境変数として設定します。
[RAM コンソール] にログインし、アクセスキー ID とシークレットアクセスキーをコピーしてから、お使いのオペレーティングシステムに基づいて設定します。例として、macOS (zsh) の場合:
macOS (zsh):
vim ~/.zshrc次の行を追加し、プレースホルダーを実際の値に置き換えてください
export ALIBABA_CLOUD_ACCESS_KEY_ID=<your-AccessKey-ID> export ALIBABA_CLOUD_ACCESS_KEY_SECRET=<your-AccessKey-secret>設定の適用
source ~/.zshrc環境変数が設定されていることを確認
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 | お使いのリージョンとネットワーク環境に対応するエンドポイントです。エンドポイントのリストについては、「エンドポイント」をご参照ください。 たとえば、中国 (杭州) リージョンのパブリックネットワークのエンドポイントは |
これらの設定が完了すると、ローカル環境で 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() 呼び出しを削除してください。
test-pyodps-local.pyという名前のローカルファイルを作成します。次のコードを追加してください:
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()スクリプトの実行
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"