高度な統合
次のセクションでは、高度な統合で必要となるconnector 機能を設定する方法を説明します。
結果セットの保存
大きな結果セットは、テンポラリテーブルまたは永続テーブルに保存する必要があります。 次のプロパティを使用して、テーブルの永続性を制御できます。
自動結果テーブル
必要に応じて、AllowLargeResultSets プロパティを有効にして、connector が自動的に宛先テーブルを作成するようにします。 クエリ結果が大きすぎてBigQuery クエリキャッシュに収まらない場合、connector はデータプロジェクト内に隠しデータセットを作成し、そのデータセット内の宛先テーブルを使用してクエリを再実行します。 データセットは、その中で作成されたすべてのテーブルが24時間で期限切れになるように設定されています。
状況によっては、connector で作成されたデータセットの名前を変更したい場合があります。 例えば、複数のユーザーがconnector を使用していて、他のユーザーによって作成されたデータセットへの書き込み権限を持っていない場合などです。 この方法の詳細は、TempTableDataset を参照してください。
明示的な結果テーブル
DestinationTable プロパティを有効にすると、connector は指定されたテーブルにクエリ結果を書き込みます。 単一のテーブルにクエリ結果を書き込むといくつかの制限が発生するため、このオプションを使用する際には注意が必要です。
- 同じ接続で2つのクエリ結果を同時に読み取ることはできません。2つのクエリが実行され、その結果が同時に読み込まれる場合、 最後に実行を完了したクエリがもう一方のクエリのデータを上書きします。
- データセットはテーブルと同じリージョンに作成する必要があります。BigQueryは、クエリが実行された場所とは異なるリージョンに宛先テーブルを書き込むことをサポートしていません。
- connector がクエリごとに一時テーブルを作成することに依存しないでください。 クエリの中には、BigQuery でクエリジョブを実行せずに、内部で処理したり、テーブルから直接読み込んだりするものもあります。
課金の制限
接続内の任意のクエリの最大コストに対する制限をオーバーライドするには、MaximumBillingTier を設定します。
バルクモード
Google BigQuery では、行のバッチを操作するためのインターフェースがいくつか提供されています。 connector は、InsertMode オプションを経由してこれらのメソッドをサポートしており、それぞれが異なるユースケースに特化しています。
- Streaming API は、最も重要な要素が素早く挿入できることである場合の使用を想定しています。 ただし、API 経由で挿入された行はキューに入れられ、遅れてテーブルに表示されます。 この遅延は20~30分に及ぶこともあり、データを挿入してすぐに他の操作を実行したい場合には、このAPI は不適合です。 ストリーミングキューに行がある間は、テーブルを変更しないようにする必要があります。 Google BigQuery は、ストリーミングキューに行がある間はテーブルでDML 操作を実行できないようにし、テーブルのメタデータ(名前、スキーマなど)を変更することによってまだコミットされていないストリーム行が失われる可能性を防ぎます。
- DML モードAPI は、標準SQL INSERT クエリを使用してデータをアップロードします。 これは、アップロードされた行にエラーがあった場合に即座にレポートされるため、最も堅牢なデータアップロード方法です。 connector もまたこのAPI を同期的に使用するため、INSERT の処理が終わると、待機することなく他の操作で任意の行を使用できます。 ただし、これは最も遅い挿入方法であり、データ量が少ない場合にのみ使用する必要があります。
- Upload モードは、データのアップロードにマルチパートアップロードAPI を使用します。 この方法は、低コストで中規模から大規模のデータのロードを合理的な時間内に実行することを目的とします。 このモードを使用する場合、connector は挿入された行をGoogle が管理するストレージにアップロードし、それらのロードジョブを作成します。 このジョブが実行されると、connector は待機するか(WaitForBatchResults を参照)、非同期で実行させることができます。 ジョブを待機すると、ジョブが遭遇したエラーがレポートされますが、より多くの時間がかかります。 ジョブが失敗したかどうかを待たずに判断するには、ジョブのストアドプロシージャを使用してジョブのステータスを手動で確認する必要があります。
- GCSStaging モードはUpload とほぼ同じですが、Google が管理するストレージではなく、Google Cloud Storage アカウントを使用して、ステージングされたデータを保存する点が異なります。
connectorは、ロード完了後にファイルを削除しなければならないため、このモードでは非同期に動作できず、したがってWaitForBatchResults は無効です。
これは外部データに依存するため、GCSBucket をバケット名に設定し、Scope(スペース区切りのスコープのセット)が少なくともスコープhttps://www.googleapis.com/auth/bigquery およびhttps://www.googleapis.com/auth/devstorage.read_write を含むことを確認する必要があります。 また、GCS で使用されるdevstorage スコープでは、Google BigQuery ではユーザーアカウントでこのスコープを使用できないため、サービスアカウントでの接続を必要とします。
バルクINSERT に加えて、connector はバルクUPDATE およびバルクDELETE 操作の実行もサポートします。 そのためには、connector は設定するフィルタと行を含むデータをBigQuery の新しいテーブルにアップロードし、2つのテーブル間でMERGE を実行してテンポラリテーブルをドロップする必要があります。 InsertMode は、テンポラリテーブルに行を挿入する方法を決定しますが、Streaming モードとDML モードはサポートされていません。
ほとんどの場合、connector はバルクアップデートのSET 句とWHERE 句のどちらにどのカラムが必要かを判断できます。 「バルクUPDATE をサポートするには、主キーを定義してください」といったエラーが表示された場合は、PrimaryKeyIdentifiers を使用して、キーとして扱うカラムをconnector に指示できます。 更新では、キーカラムの値は一致する行を見つけるためにのみ使用され、キーカラムの値の更新はできません。