注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。
Foundry を Google BigQuery に接続して、BigQuery テーブルと Foundry データセットの間でデータを読み取り、同期します。
| 機能 | ステータス |
|---|---|
| 探索 | 🟢 一般提供 |
| 一括インポート | 🟢 一般提供 |
| インクリメンタル(差分連携) | 🟢 一般提供 |
| 仮想テーブル | 🟢 一般提供 |
| コンピュートプッシュダウン | 🟢 一般提供 |
| エクスポートタスク | 🟡 サンセット |
Foundry でのコネクターのセットアップについて詳しくはこちらをご覧ください。
BigQuery の認証とセットアップを進めるには、Google Cloud IAM サービスアカウント ↗ が必要です。
BigQuery コネクターを使用するには、以下の Identity and Access Management(IAM)ロールが必要です。
BigQuery データの読み取り:
Foundry から BigQuery へのデータのエクスポート:
一時テーブルの使用:
必要なロールについて詳しくはこちらの Google Cloud のアクセス制御に関するドキュメント ↗ をご覧ください。
利用可能な認証方法から1つを選択します。
GCP インスタンス アカウント: インスタンスベースの認証のセットアップ方法については、Google Cloud ドキュメント ↗ を参照してください。
サービスアカウントキーファイル: サービスアカウントキーファイル認証のセットアップ方法については、Google Cloud ドキュメント ↗ を参照してください。キーファイルは JSON または PKCS8 の資格情報として指定できます。
ワークロード ID フェデレーション (OIDC): 表示されるソースシステムの設定手順に従って、OIDC をセットアップします。ワークロード ID フェデレーションの詳細については Google Cloud ドキュメント ↗ を、Foundry での OIDC の動作の詳細については Foundry のドキュメントを参照してください。
BigQuery コネクターには、ポート443で以下のドメインへのネットワークアクセスが必要です。
bigquery.googleapis.combigquerystorage.googleapis.comstorage.googleapis.comwww.googleapis.com以下のドメインへの追加のアクセスが必要になる場合があります。
oauth2.googleapis.comaccounts.google.comGoogle Cloud Platform (GCP) 上の Foundry と GCP 上の BigQuery の間で直接接続を確立する場合、関連する VPC Service Controls でも接続を有効にする必要があります。この接続がセットアップに必要な場合は、追加のガイダンスについて Palantir サポートにお問い合わせください。
BigQuery コネクターでは、以下の設定オプションを利用できます。
| オプション | 必須かどうか | 説明 |
|---|---|---|
| プロジェクトID | はい | BigQuery プロジェクトの ID です。同期するデータにかかわらず、BigQuery のコンピュート使用量はこのプロジェクトに課金されます。 |
| 資格情報の設定 | はい | 上記の認証のガイダンスに従って設定します。 |
| Cloud Storage バケット | いいえ | BigQuery へのデータ書き込み時にステージング場所として使用する Cloud Storage バケットの名前を追加します。 |
| プロキシ設定 | いいえ | BigQuery へのプロキシ接続を許可するには、有効にします。 |
| 一時テーブルの設定 | いいえ [1] | 一時テーブルを使用するには、有効にします。 |
| gRPC 設定 | いいえ | gRPC チャネルの設定に使用する詳細設定です。 |
| Spark 設定 | いいえ [2] | 仮想テーブルの使用時に、パラメーター化されていない BIGNUMERIC 列を Spark で読み取るには、Spark に対応した BIGNUMERIC のスケールと精度を有効にします。有効にすると、パラメーター化されていない BIGNUMERIC 列では、Spark の DecimalType に対応した最大の精度とスケールが使用されます。 |
| 追加のプロジェクト | いいえ | 同じ接続でアクセスする必要がある追加のプロジェクトの ID を追加します。このコネクターの資格情報として使用する Google Cloud アカウントには、これらのプロジェクトへのアクセス権が必要です。BigQuery データへのアクセスやコンピュートの使用は、コネクターのプロジェクトIDに課金されます。 |
[1] 仮想テーブルを介して BigQuery ビュー ↗を登録する場合は、一時テーブルを有効にする必要があります。
[2] パラメーター化されていない BIGNUMERIC 列を読み取るには、Spark に対応した BIGNUMERIC のスケールと精度を有効にする必要があります。Spark が対応する精度の最大値は38、スケールの最大値は18であるため、BigQuery 内のデータの精度またはスケールがこれらの上限を超えると、データが失われる可能性があります。精度またはスケールが Spark の上限を超える、パラメーター化された BIGNUMERIC 列には対応していません。
BigQuery コネクターでは、大規模なデータ同期やカスタムクエリ向けに高度な同期設定を利用できます。より複雑なシナリオでは、仮想テーブルまたはコードを使用した代替アプリケーションを使用します。
BigQuery の同期を設定するには、ソースの概要画面の右上にあるソースを探索して同期を作成を選択します。次に、Foundry に同期するテーブルを選択します。同期の準備ができたら、x個のデータセットの同期を作成を選択します。
Foundry のソース探索について詳しくはこちら。
利用可能な同期を探索してコネクターに追加したら、同期を編集に移動します。左側の同期パネルで、設定する同期を見つけ、その右側にある > を選択します。
BigQuery のテーブルは、データが Avro 形式で保存された状態で Foundry にインポートされます。インポート時には、BIGNUMERIC 型および TIME 型の列には対応していません。
Foundry から BigQuery にデータをエクスポートする場合、MAPS、STRUCTS、ARRAYS を除くすべての列のデータ型に対応しています。
BigQuery から Foundry に同期するデータを選択します。
テーブル全体を Foundry に同期するには、次の情報を入力します。
| オプション | 必須? | 説明 |
|---|---|---|
| BigQuery プロジェクトID | いいえ | テーブルが属するプロジェクトの ID。 |
| BigQuery データセット | はい | テーブルが属するデータセットの名前。 |
| BigQuery テーブル | いいえ | Foundry に同期するテーブルの名前。 |
任意のクエリを実行でき、その結果は Foundry に保存されます。クエリの出力は20 GB(BigQuery テーブルの最大サイズ)未満である必要があります。それを超える場合は、一時テーブルの使用を有効にする必要があります。クエリはキーワード select または with で始まる必要があります。例:SELECT * from table_name limit 100;。
通常、同期では、同期の間にデータが変更されたかどうかにかかわらず、対象テーブルから条件に一致するすべての行をインポートします。一方、インクリメンタル同期では、直近の同期に関する状態を保持し、対象から条件に一致する新しい行のみを取り込みます。
インクリメンタル同期は、BigQuery から大規模なテーブルを取り込む際に使用できます。インクリメンタル同期を使用するには、テーブルに厳密に単調増加する列が含まれている必要があります。また、読み取り元のテーブルまたはクエリには、次のいずれかのデータ型の列が含まれている必要があります。
INT64FLOAT64NUMERICBIGNUMERICSTRINGTIMESTAMPDATETIMEDATETIME例: 5 TB のテーブルに、BigQuery に同期したい数十億行のデータが含まれています。このテーブルには、id という名前の単調増加する列があります。id 列をインクリメンタル列として使用し、初期値を -1、上限を5000万行に設定することで、1回につき5000万行を取り込むように同期を設定できます。
同期を初めて実行すると、id の値が -1より大きい最初の5000万行(id に基づく昇順)が Foundry に取り込まれます。たとえば、この同期を数回実行し、前回の実行で取り込まれた最大の id が 19384004822 だった場合、次の同期では 19384004822 より大きい最初の id から始まる次の5000万行が取り込まれ、以降も同様に続きます。
インクリメンタル同期には、次の設定が必要です。
| オプション | 必須? | 説明 |
|---|---|---|
| 列 | はい | インクリメンタルな取り込みに使用する列を選択します。テーブルに対応するデータ型の列が含まれていない場合、ドロップダウンは空になります。 |
| 初期値 | はい | データの同期を開始する値。 |
| 上限 | いいえ | 1回の同期でダウンロードするレコード数。 |
カスタムクエリの同期でインクリメンタルクエリを有効にするには、クエリを次の形式に合わせて更新する必要があります。
SELECT * from table_name where incremental_column_name > @value order by incremental_column_name asc limit @limit
標準以外の BigQuery テーブルから20 GB を超えるデータを同期する場合は、一時テーブルを有効にする必要があります。一時テーブルを使用すると、BigQuery で大規模なクエリ出力の結果や、ビューおよびその他の標準以外のテーブルのデータをインポートでき、大規模なインクリメンタルインポートおよび取り込みも可能になります。
1回の同期で、ディスクの空き容量までのデータをインポートできます。Foundry ワーカーで実行される同期では、通常、この上限は600 GB です。より大きなテーブルをインポートするには、インクリメンタル同期を使用します。
一時テーブルを使用するには、コネクターの設定で一時テーブルの設定を有効にし、必要に応じて次の設定を行います。
Palantir_temporary_tables データセットが作成されます。この選択肢を使用するには、BigQuery アカウントがプロジェクトに対する BigQuery データ編集者ロールを持っている必要があります。BigQuery ビュー ↗を仮想テーブルで使用する場合は、一時テーブルを有効にする必要があります。
BigQuery へのエクスポートは、エクスポートタスクを介して行います。より複雑なシナリオでは、プロコードの代替アプリケーションを使用します。
コネクターは、次の2つの方法で BigQuery にエクスポートできます。
API 経由の書き込みは、数百万行規模のデータに適しています。このモードで期待されるパフォーマンスは、約2分で100万行をエクスポートすることです。データが数十億行規模に達する場合は、代わりに Google Cloud Storage を使用してください。
データのエクスポートを開始するには、エクスポートタスクを設定する必要があります。エクスポート先のコネクターが含まれるプロジェクトフォルダーに移動します。コネクター名を右クリックし、Data Connection タスクを作成を選択します。
Data Connection の表示の左側パネルで、ソース名が使用するコネクターと一致していることを確認します。次に、入力項目に入力データセットを追加します。入力データセットには inputDataset という名前を付ける必要があり、これはエクスポートする Foundry データセットです。エクスポートタスクには、出力を1個設定する必要もあります。出力データセットには outputDataset という名前を付け、Foundry データセットを指定する必要があります。出力データセットは、タスクの実行、スケジュール設定、および監視に使用されます。
Data Connection の表示の左側パネルで、次の操作を行います。
inputDataset という名前の入力を追加します。入力データセットは、エクスポートする Foundry データセットです。outputDataset という名前の出力を追加します。出力データセットは、タスクの実行、スケジュール設定、および監視に使用されます。左側パネルに表示されるコネクターと入力データセットのラベルには、YAML で定義した名前は反映されません。
エクスポートタスクの YAML を作成するときは、次のオプションを使用します。
| オプション | 必須かどうか | デフォルト | 説明 |
|---|---|---|---|
project | いいえ | コネクターのプロジェクトID | 宛先テーブルが属するプロジェクトの ID。 |
dataset | はい | テーブルが属するデータセットの名前。 | |
table | はい | データのエクスポート先テーブルの名前。 | |
incrementalType | はい | SNAPSHOT | 値は SNAPSHOT または REQUIRE_INCREMENTAL のいずれかです。 • スナップショットモードでエクスポート: 宛先テーブルの内容が置き換えられます。 • インクリメンタル(差分連携)モードでエクスポート: 既存のテーブルに内容が追加されます。 |
インクリメンタルエクスポートを設定するには、最初のエクスポートを SNAPSHOT として実行してから、incrementalType を REQUIRE_INCREMENTAL に変更してください。
タスクの設定例:
Copied!1 2 3 4 5 6 7type: magritte-bigquery-export-task config: table: dataset: datasetInBigQuery table: tableInBigQuery project: projectId #(Optional: Do not specify unless the Project for export differs from the Project configured for the connector.) incrementalType: SNAPSHOT | REQUIRE_INCREMENTAL
BigQuery へのエクスポートに対応しているのは、行が Parquet 形式で保存されているデータセットのみです。
エクスポートタスクを設定したら、右上隅の保存を選択します。
宛先テーブルに行を追加する必要がある場合は、データセットを置き換えるのではなく、REQUIRE_INCREMENTAL を使用できます。
インクリメンタル(差分)同期では、入力データセットへの変更が行の追加のみであること、および BigQuery の宛先テーブルが Foundry の入力データセットのスキーマと一致していることが必要です。
Cloud Storage 経由でエクスポートするには、コネクターの設定で Cloud Storage バケットを設定する必要があります。また、バケットに一時的に書き込まれたデータにアクセスできるユーザーを可能な限り少なくするため、Cloud Storage バケットはコネクターの一時テーブル専用にする必要があります。
BigQuery APIs ではなく、Cloud Storage 経由で BigQuery にエクスポートすることを推奨します。Cloud Storage は大規模なデータをより効率的に処理でき、BigQuery に一時テーブルを作成しません。
エクスポートジョブは、宛先テーブルとともに一時テーブルを作成します。この一時テーブルには、追加のアクセス制限は適用されません。また、SNAPSHOT エクスポートではテーブルを削除して再作成するため、追加のアクセス制限も削除されます。
BigQuery APIs 経由のエクスポートでは、データは一時テーブル datasetName.tableName_temp_$timestamp にエクスポートされます。エクスポートが完了すると、行は一時テーブルから宛先テーブルに自動的に転送されます。
BigQuery APIs 経由のエクスポートは、Hive テーブルのパーティションに対応していません。Hive テーブルでパーティション分割されたデータセットは、代わりに Cloud Storage 経由でエクスポートしてください。
エクスポートを REQUIRE_INCREMENTAL モードで実行する場合は、宛先テーブルを共有できます。SNAPSHOT モードで実行すると、実行のたびにテーブルが再作成されるため、共有設定を再適用する必要があります。
BigQuery APIs 経由で正常にエクスポートするには、エクスポート先のテーブルに BigQuery の行レベルまたは列レベルの権限を適用しないでください。
より複雑なシナリオでは、プロコードの代替アプリケーションを使用して BigQuery ソースに接続できます。
以下の例では、外部トランスフォームで Google BigQuery の Python クライアント ↗ google-cloud-bigquery を使用して、BigQuery ソースに接続する方法を示します。
これらの例は、BigQuery に保存された Shipments テーブルに基づいています。このテーブルは、荷物のシップメントと、その重量、運送業者、追跡番号の一覧を表します。
この例では、指定された運送業者の一覧に含まれ、かつ一定の重量を超えるシップメントを読み込みます。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44from pandas import DataFrame from transforms.api import lightweight, Output, Input, transform_pandas from transforms.external.systems import ResolvedSource, external_systems, Source from google.cloud import bigquery import json @lightweight @external_systems( bigquery_source=Source("<source_rid>") ) @transform_pandas( Output("<dataset_rid>"), carriers_df=Input("<dataset_rid>") # スキーマ [carrier_name: String, carrier_details: String] を持つデータフレーム ) def read(bigquery_source: ResolvedSource, carriers_df: DataFrame) -> DataFrame: # BigQuery クライアントを認証します account_info = json.loads(bigquery_source.get_secret("jsonCredentials")) client = bigquery.Client.from_service_account_info(account_info) # テーブル参照 bigquery_project = "<bigquery_project_id>" bigquery_dataset = "<bigquery_dataset_id>" bigquery_table = "<bigquery_table_id>" table_ref = f"{bigquery_project}.{bigquery_dataset}.{bigquery_table}" # フィルターのパラメーター carrier_list = carriers_df['carrier_name'].drop_duplicates().tolist() min_weight = 10 job_config = bigquery.QueryJobConfig( query_parameters=[ bigquery.ArrayQueryParameter("carrier_list", "STRING", carrier_list), bigquery.ScalarQueryParameter("min_weight", "FLOAT64", min_weight) ] ) query = f""" SELECT shipment_id, carrier, weight, tracking_number FROM `{table_ref}` WHERE carrier IN UNNEST(@carrier_list) AND weight >= @min_weight """ query_job = client.query(query, job_config=job_config) return query_job.to_dataframe()
この関数は、指定されたシップメント情報に基づいてシップメントの追跡番号を更新し、更新されたシップメントの詳細を返します。
Copied!1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68from pandas import DataFrame from transforms.api import lightweight, Output, Input, transform_pandas from transforms.external.systems import ResolvedSource, external_systems, Source from google.cloud import bigquery import json @lightweight @external_systems( bigquery_source=Source("<source_rid>") ) @transform_pandas( Output("<dataset_rid>"), shipments_df=Input("<dataset_rid>"), # スキーマ [shipment_id: Long, tracking_number: String] を持つ DataFrame ) def update_tracking_numbers(bigquery_source: ResolvedSource, shipments_df: DataFrame) -> DataFrame: # BigQuery クライアントを認証します account_info = json.loads(bigquery_source.get_secret("jsonCredentials")) client = bigquery.Client.from_service_account_info(account_info) # テーブル参照 bigquery_project = "<bigquery_project_id>" bigquery_dataset = "<bigquery_dataset_id>" bigquery_table = "<bigquery_table_id>" table_ref = f"{bigquery_project}.{bigquery_dataset}.{bigquery_table}" # 1. 一時テーブルが存在する場合はクリアします temp_table_id = f"{bigquery_project}.{bigquery_dataset}.temp_update_tracking" client.delete_table(temp_table_id, not_found_ok=True) # 2. shipments_df を一時テーブルにアップロードします load_job_config = bigquery.LoadJobConfig( schema=[ bigquery.SchemaField("shipment_id", "INT64"), bigquery.SchemaField("tracking_number", "STRING"), ] ) job = client.load_table_from_dataframe(shipments_df, temp_table_id, job_config=load_job_config) job.result() # 読み込みが完了するまで待ちます # 3. MERGE でメインテーブルの tracking_number を更新します merge_query = f""" MERGE `{table_ref}` T USING `{temp_table_id}` S ON T.shipment_id = S.shipment_id WHEN MATCHED THEN UPDATE SET tracking_number = S.tracking_number """ client.query(merge_query).result() # 3. (任意)一時テーブルを削除します client.delete_table(temp_table_id, not_found_ok=True) # 必要に応じて、確認用に更新された行を DataFrame として返します updated_ids = shipments_df["shipment_id"].tolist() query = f""" SELECT shipment_id, tracking_number FROM `{table_ref}` WHERE shipment_id IN UNNEST(@updated_ids) """ job_config = bigquery.QueryJobConfig( query_parameters=[ bigquery.ArrayQueryParameter("updated_ids", "INT64", [int(x) for x in updated_ids]) ] ) updated_rows = client.query(query, job_config=job_config).to_dataframe() return updated_rows
このセクションでは、BigQuery ソースで仮想テーブルを使用する際の詳細を説明します。Foundry データセットに同期する場合、このセクションは適用されません。
次のテーブルは、BigQuery でサポートされている仮想テーブルの機能を示しています。
| 機能 | ステータス |
|---|---|
| 一括登録 | 🟢 一般提供 |
| 自動登録 | 🟢 一般提供 |
| テーブル入力 | 🟢 一般提供:Code Repositories、Pipeline Builder のテーブル、ビュー、マテリアライズドビュー |
| テーブル出力 | 🟢 一般提供:Code Repositories、Pipeline Builder のテーブル |
| インクリメンタル(差分処理)パイプライン | 🟢 一般提供:APPEND のみ [1] |
| コンピュートプッシュダウン | 🟢 一般提供 |
BigQuery テーブルを入力または出力として使用できる、サポート対象の Foundry ワークフローについては、仮想テーブルのドキュメントを参照してください。
[1] BigQuery 仮想テーブルを元にしているパイプラインでインクリメンタル処理を有効にするには、適切な保持期間で Time Travel ↗ が有効になっていることを確認してください。この機能は Change History ↗ に依存しており、現在は APPEND のみに対応しています。Python トランスフォームの current および added 読み取りモードに対応しています。Python トランスフォームでは、_CHANGE_TYPE 列と _CHANGE_TIMESTAMP 列が利用可能になります。
BigQuery は UPDATE または DELETE の変更情報を提供しないため、仮想テーブルを元にしているインクリメンタルパイプラインは、必ず APPEND 専用のソーステーブルを使用して構築してください。詳細については、公式の BigQuery ドキュメント ↗ を参照してください。
仮想テーブルを使用する場合は、次のソース設定の要件に留意してください。
BIGNUMERIC 列を読み取るには、Spark の設定を行います。詳細については、上記の接続情報と一時テーブルのセクションを参照してください。
Foundry では、仮想テーブルを使用する際に、コンピュートを BigQuery にプッシュダウンできます。仮想テーブルの入力には、述語プッシュダウンのサポートが組み込まれた BigQuery Spark コネクター ↗が使用されます。
同じソースに登録された BigQuery 仮想テーブルをパイプラインの入力および出力として使用する場合、コンピュートを完全に BigQuery に委譲できます。この機能は現在、Python トランスフォームで利用可能です。コンピュートを BigQuery にプッシュダウンする方法の詳細については、Python のドキュメントを参照してください。
<dataset> が場所 <location> に見つかりませんでしたBigQuery は、クエリで使用される入力、またはクエリの結果が保存される場所に基づいて、そのクエリを実行する場所を決定します。一時テーブルを使用する場合、出力は一時テーブル用のデータセット内の一時テーブルに設定されます。このデータセットの場所によって、クエリの実行場所が決まります。同期のすべての入力と一時テーブル用のデータセットが同じリージョンにあることを確認してください。データセットを自動的に作成する。 設定が有効になっている場合は、Google Cloud コンソールまたは Google の SDK/API を使用して、Palantir_temporary_tables という名前のデータセットの場所を特定します。
JSON 列などの大きなコンテンツを含むデータを同期する場合、上記のエラーで転送に失敗することがあります。ソースの gRPC 設定で BigQuery の受信メッセージの最大サイズを調整し、1回の API 呼び出しで転送するデータ量を増やします。1回の呼び出しで複数行を取得するため、最大の行サイズに設定するだけでは不十分な場合があることに留意してください。
この設定オプションは、接続設定 > 接続情報に移動し、追加オプションまでスクロールして gRPC 設定を選択すると表示されます。

プレビューの読み込みに失敗し、対象の BigQuery テーブルがビューである場合、スキーマの不一致が原因である可能性があります。ビューのスキーマは、作成時に定義された SQL クエリの結果によって決まります。その後、基となるテーブルの構造が変更されても、ビューのスキーマには自動的に適用されません。そのため、ビューを使用しようとした際(たとえば、Palantir プラットフォームで同期や仮想テーブルを介して使用する際)に、予期しない動作が発生する可能性があります。
BigQuery コンソールでビューと基となるテーブルのスキーマを比較し、不一致がないか調べることで、これを確認できます。不一致には、次のようなものがあります。
不一致が見つかった場合は、CREATE OR REPLACE VIEW または ALTER VIEW を使用してビューを再作成または更新することで対処できます。詳細については、Google Cloud コミュニティの投稿 ↗を参照してください。期待される動作の詳細と、ベストプラクティスに関する追加のガイダンスが説明されています。