pandasとの違い

Apache BeamデータフレームAPIは、pandasのドロップイン置換を目指していますが、いくつかの違いに注意する必要があります。このページでは、Beam APIとpandas APIの違いについて説明し、BeamデータフレームAPIを使用するためのヒントを提供します。BeamデータフレームAPIでサポートされている操作と引数の詳細については、apache_beam.dataframe.frames APIリファレンスを参照してください。

pandasソースの操作

Beam操作は常にパイプラインに関連付けられています。ソースデータをBeamデータフレームに読み込むには、ソースをパイプラインオブジェクトに適用する必要があります。たとえば、CSVファイルから入力を読み込むには、次のようにread_csvを使用できます。

df = p | beam.dataframe.io.read_csv(...)

これはpandasのread_csvに似ていますが、dfはファイルの内容を表す遅延評価されるBeamデータフレームです。入力ファイル名は、fileio.MatchFilesで認識される任意のファイルパターンにすることができます。

データフレームAPIでソースとシンクを使用する例については、taxiride.pyを参照してください。

サポートされていない操作のクラス

以下のセクションでは、BeamデータフレームAPIでまだサポートされていない、または制限付きでサポートされている操作のクラスについて説明します。該当する場合、回避策が示唆されています。

並列化できない操作

例:DeferredDataFrame.quantileDeferredDataFrame.mode

分散処理をサポートするために、Beamはデータのサブセットに対してデータフレーム操作を並列で呼び出します。一部のデータフレーム操作は並列化できません。これらの操作は、デフォルトでNonParallelOperationエラーを発生させます。

回避策

並列化できない操作を使用する場合は、beam.dataframe.allow_non_parallel_operationsブロックで囲むことができます。例:

from apache_beam import dataframe

with dataframe.allow_non_parallel_operations():
  quantiles = df.quantile()

これは入力データセット全体を単一のノードに収集するため、メモリ不足になるリスクがあることに注意してください。この回避策は、入力が単一のワーカーで処理できるほど小さいことが確実な場合にのみ使用する必要があります。

遅延評価されない列を生成する操作

例:DeferredDataFrame.pivotDeferredDataFrame.transposeDeferredSeries.factorize

Beamデータフレーム操作は遅延評価されますが、結果のデータフレームのスキーマは遅延評価されません。つまり、結果の列はデータにアクセスせずに計算できる必要があります。一部のデータフレーム操作はこの使用方法をサポートできないため、実装できません。これらの操作は、WontImplementErrorを発生させます。

現在、この問題の回避策はありません。ただし、将来的には、Beamデータフレームはカテゴリ列に対する遅延評価されない列操作をサポートする可能性があります。この作業は、課題20958で追跡されています。

遅延評価されない値またはプロットを生成する操作

例:DeferredSeries.to_listDeferredSeries.arrayDeferredDataFrame.plot

Beamは遅延評価されるAPIであるため、遅延評価されない値またはプロットを生成するデータフレーム操作を実装することは不可能です。これらの操作が呼び出されると、WontImplementErrorが発生します。

これらの操作は、Interactive Beamとの緊密な統合を通じて、将来的にサポートされる可能性があります。この問題の進捗状況を追跡するには、課題21638に従ってください。この作業の優先順位を上げる必要があると思われる場合は、お問い合わせください。

回避策

Interactive Beamを使用している場合は、collectを使用してデータセットをローカルメモリに取り込み、これらの操作を実行できます。

順序依存の操作

例:DeferredDataFrame.headDeferredSeries.diffDeferredDataFrame.interpolate

Beam PCollectionは本質的に順序付けされていないため、行の順序に依存するpandas操作はサポートされていません。これらの操作は、WontImplementErrorを発生させます。

順序依存の操作は、将来的にサポートされる可能性があります。この問題の進捗状況を追跡するには、課題20862に従ってください。この作業の優先順位を上げる必要があると思われる場合は、お問い合わせください。

回避策

Interactive Beamを使用している場合は、collectを使用してデータセットをローカルメモリに取り込み、これらの操作を実行できます。

あるいは、コードを順序に依存しないように書き直す方法があるかもしれません。たとえば、pandasユーザーは、データを覗き見するために順序依存のhead操作をよく呼び出しますが、要素のサブセットを表示したいだけであれば、データを最初に収集する必要のないsampleを使用することもできます。 同様に、sort_values(...).の代わりにnlargestを使用することもできます。

遅延評価されるスカラー値を生成する操作

一部のデータフレーム操作では、遅延評価されるスカラー値が生成されます。 Beamでは、値の実際の計算は遅延されるため、値を制御フローに使用できません。たとえば、Series.sumで合計を計算できますが、結果データがすぐに利用できないため、結果に基づいてすぐに分岐することはできません。 Series.is_uniqueも同様の例です。分岐ロジックまたは真偽テストに遅延評価されるスカラー値を使用すると、TypeErrorが発生します。

まだ実装されていない操作

BeamデータフレームAPIは、一般的に使用されるpandasデータフレーム操作の多くを実装しており、残りの操作も積極的にサポートに取り組んでいます.しかし、パンダは大きなAPIを持っており、まだギャップがあります(課題20318)。 まだ実装されていない操作を呼び出すと、NotImplementedErrorが発生します。優先順位を上げる必要があると思われる不足している操作に遭遇した場合は、お知らせください

Interactive Beamを使用してpandas API全体にアクセスする

Interactive Beamは、インタラクティブなノートブックでの使用を目的としたモジュールです。慣例的にibとしてインポートされるこのモジュールは、PCollectionまたは遅延評価されるデータフレームをpandasデータフレームとしてローカルメモリに取り込むib.collect関数を提供します。 ib.collectを使用して遅延評価されるデータフレームを具体化した後、Beamでサポートされているものだけでなく、pandas APIの任意の操作を実行できます。

Colabで実行 Colabで実行





ノートブックでBeamを使い始めるには、Apache Beamを試すを参照してください。