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

MaxCompute:PyODPSノードを使用してローカルディレクトリへのデータのダウンロードを回避する

最終更新日:Jan 17, 2025

このトピックでは、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')