このトピックでは、PyODPSノードを使用して、処理用のローカルディレクトリへのデータのダウンロードを回避したり、オンラインでデータを処理したりする方法について説明します。
背景情報
PyODPSは、データをローカルディレクトリにダウンロードする複数の方法を提供します。 処理のためにデータをローカルディレクトリにダウンロードし、データをMaxComputeにアップロードできます。 ただし、ローカルディレクトリにデータをダウンロードする場合、MaxComputeの超並列処理機能を使用できないため、ローカルデータ処理は非効率的です。 データ量が10 MBを超える場合は、処理のためにローカルディレクトリにデータをダウンロードしないことを推奨します。 次のいずれかの方法を使用して、ローカルディレクトリにデータをダウンロードできます。
head、tail、またはto_pandasメソッドを使用します。 ほとんどの場合、
headまたはtailメソッドを使用して少量のデータを取得します。 大量のデータを取得する場合は、persistメソッドを使用してMaxComputeテーブルにデータを保存します。 詳細については、「実行」をご参照ください。open_readerメソッドを使用します。 テーブルまたはSQLインスタンスでopen_readerを実行して、データを取得できます。 大量のデータを処理する必要がある場合は、PyODPS DataFrameまたはMaxCompute SQLを使用することを推奨します。 PyODPS DataFrameオブジェクトは、MaxComputeテーブルに基づいて作成されます。 この方法は、ローカルデータ処理よりも高い効率を提供する。
サンプルコード
JSON文字列を複数の行に変換します。 各行はキーとその値で構成されます。
ローカルテストでは、
headメソッドを使用して少量のデータを取得します。In [12]: df.head(2) json 0 {"a": 1, "b": 2} 1 {"c": 4, "b": 3} In [14]: from odps.df import output In [16]: @output(['k', 'v'], ['string', 'int']) ...: def h(row): ...: import json ...: for k, v in json.loads(row.json).items(): ...: yield k, v ...: In [21]: df.apply(h, axis=1).head(4) k v 0 a 1 1 b 2 2 c 4 3 b 3オンラインプロダクションでは、
persistメソッドを使用してMaxComputeテーブルに大量のデータを保存します。In [14]: from odps.df import output In [16]: @output(['k', 'v'], ['string', 'int']) ...: def h(row): ...: import json ...: for k, v in json.loads(row.json).items(): ...: yield k, v ...: In [21]: df.apply(h, axis=1).persist('my_table')