0

私はしばらくデータフロー/ビッグクエリをいじっていますが、特定のタイプのメソッドを使用してテーブルをクエリするときなど、いくつかの基本的なことについて頭を悩ませることはできません。

+ 短くてシンプル、 + PCollectionで返さBigQueryIO.Readれる 大きな結果に適して いますが、結果の新しいテーブル スキーマを返さないため、 両方を (1) にエクスポートするのが難しくなります。 csv ファイル - テーブル ヘッダー、フィールド!! (2) bigquery テーブル - スキーマなし! クエリ結果を bigquery テーブルまたは .csv ファイルに保存するたびに、テーブル スキーマまたは fields-csv ヘッダーを手動で定義する必要があります。 ---> これをエレガントに自動的に行う方法はありますか?




クエリを実行するもう 1 つのオプションは、Jobs : Queryを使用することです。
これにも長所と短所があります:
+ クエリ結果のテーブル スキーマを返します
- 認証が必要です。最終的には、正確な単純なクエリのコーディングがはるかに多くなります
-> 非同期モードと同期モード。-オプションを指定した非同期モードを除き、
大きな結果には適していません。バックグラウンドで複数のクエリが発生し、取得された行の完全なリストを取得するために構成する必要があります (??) - 結果はテーブルに保存できます。ただし、非同期クエリのみが結果を永続的なテーブルに保存できます(一時テーブルだけではありません)。
allowLargeResults

疑問が残ります:

(1) どちらの方法がいつ、より優れているか?

(2) 照会するテーブルに非常に大量のデータがあり、非常に大きな結果が得られる場合、どの照会方法が優先されますか?

(3) 非常に大きな結果を処理する場合、テーブルまたは .csv ファイルのどちらのエクスポートが優先されますか?

4

1 に答える 1

1

BigQueryIO.Readテーブルを読み取り、クエリを実行しないことに注意してください。ヘルパー.fromQuery()により、ソースはクエリを実行し、クエリ結果が書き込まれた宛先テーブルを読み取ることができます。クエリの実行をテーブルの読み取りから分離すると便利な場合があります。

Google Cloud Storage へのエクスポート オペレーションをBigQueryIO.Read実行し、 GCS からデータを処理すると考えることができます。jobs.insert()

GCS にエクスポートされたデータの効率的な並列処理については、 https: //cloud.google.com/bigquery/exporting-data-from-bigquery#exportingmultiple の「複数のワイルドカード URI」を参照してください。エクスポートされたデータの (小さな) シャードを次のように使用できます。エクスポート中なので、BigQuery エクスポート ジョブ全体を完了するために、並列読み取り操作の処理をブロックする必要はありません。複数のワイルドカードを使用すると、事前にワーカーの並列処理を決定できます。BigQuery は順番にデータを書き込むため、各ワーカーはシャードを個別に処理し、データのサブセットが完全に処理された時点を識別できます。

Cloud Dataflow はカスタム ソース ( https://cloud.google.com/dataflow/model/custom-io#creating-sources ) をサポートしているため、テーブルのスキーマのサイド チャネルを持つバージョンで BigQueryIO.Read を複製できます。あなたは(*)を操作しています。

(*) 私は Cloud Dataflow の専門家ではないので、このサイド チャネルを構築する方法がわかりません。おそらく、このカスタム ソースからエクスポートされたスキーマは、テーブルのスキーマと BLOB でありParDo、スキーマを取得して BLOB をそのスキーマに変換するソースをラップできますか? その時点で、コードは各行のスキーマとデータを確認します。これは問題を解決するための最も効率的な方法とは思えませんが、うまくいく可能性があります。

于 2016-01-04T18:54:59.100 に答える