Google BigQuery でフェデレーション クエリを実行する
この記事では、Azure Databricks で管理されていない BigQuery データに対してフェデレーション クエリを実行するように、Lakehouse フェデレーションを設定する方法について説明します。 Lakehouse フェデレーションの詳細については、「Lakehouse フェデレーションとは?」を参照してください。
Lakehouse フェデレーションを使って BigQuery データベースに接続するには、Azure Databricks の Unity Catalog メタストアに次のものを作成する必要があります。
- BigQuery データベースへの "接続"。
- Unity Catalog で BigQuery データベースをミラーリングする "外部カタログ"。これにより、Unity Catalog のクエリ構文とデータ ガバナンス ツールを使って、Azure Databricks ユーザーのデータベースへのアクセスを管理できるようになります。
準備
ワークスペースの要件:
- Unity Catalog を使用できるワークスペース。
コンピューティングの要件:
- Databricks Runtime クラスターまたは SQL ウェアハウスから対象となる データベース システムに接続するためのネットワーク接続。 「レイクハウス フェデレーションのためのネットワークに関する推奨事項」を参照してください。
- Azure Databricks クラスターは、Databricks Runtime 16.1 以上と、共有またはシングル ユーザー アクセス モードを使用する必要があります。
- SQL ウェアハウスは、Pro またはサーバーレスである必要があります。
必要なアクセス許可:
- 接続を作成するには、メタストア管理者であるか、ワークスペースにアタッチされている Unity Catalog メタストアに対する
CREATE CONNECTION
特権を持つユーザーである必要があります。 - 外部カタログを作成するには、メタストアに対する
CREATE CATALOG
権限を持ち、接続の所有者であるか、接続に対するCREATE FOREIGN CATALOG
特権を持っている必要があります。
追加の権限要件は、以下の各タスク ベースのセクションで規定されています。
接続を作成する
接続では、外部データベース システムにアクセスするためのパスと資格情報を指定します。 接続を作成するには、Catalog Explorer を使用するか、Azure Databricks ノートブックまたは Databricks SQL クエリ エディターで CREATE CONNECTION
SQL コマンドを使用します。
Note
Databricks REST API または Databricks CLI を使用して接続を作成することもできます。 POST /api/2.1/unity-catalog/connections および Unity Catalog コマンドを参照してください。
必要な権限: メタストア管理者、または CREATE CONNECTION
特権を持つユーザー。
カタログ エクスプローラー
Azure Databricks ワークスペースで、
[カタログ] をクリックします。
[カタログ] ペインの上部にある
[追加] アイコンをクリックし、メニューから [接続の追加] を選択します。
または、[クイック アクセス] ページで、[外部データ >] ボタンをクリックし、[接続] タブに移動し、[接続の作成] をクリックします。
[接続のセットアップ] ウィザードの [Connection basics] (接続の基本) ページで、わかりやすい [接続名] を入力します。
[接続の種類] で [Google BigQuery] を選んでから、[次へ] をクリックします。
[認証] ページで、BigQuery インスタンスの [Google service account key json] (Google サービス アカウント キー json) を入力します。
BigQuery プロジェクトの指定と、認証の提供に使用される生の JSON オブジェクトは次のとおりです。 この JSON オブジェクトを生成し、Google Cloud の [キー] の下にあるサービス アカウントの詳細ページからダウンロードできます。 サービス アカウントには、BigQuery で適切なアクセス許可、つまり BigQuery ユーザー および BigQuery データ ビューアーが付与されている必要があります。 以下に例を示します。
{ "type": "service_account", "project_id": "PROJECT_ID", "private_key_id": "KEY_ID", "private_key": "PRIVATE_KEY", "client_email": "SERVICE_ACCOUNT_EMAIL", "client_id": "CLIENT_ID", "auth_uri": "https://accounts.google.com/o/oauth2/auth", "token_uri": "https://accounts.google.com/o/oauth2/token", "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs", "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL", "universe_domain": "googleapis.com" }
(オプション) BigQuery インスタンスの [プロジェクト ID] を入力します。
これは、この接続で実行されるすべてのクエリの課金に使用される BigQuery プロジェクトの名前です。 既定値は、サービス アカウントのプロジェクト ID です。 サービス アカウントには、BigQuery ユーザーを含め、BigQuery でこのプロジェクトに適切なアクセス許可が付与されている必要があります。 このプロジェクトでは、BigQuery によって一時テーブルを格納するために使用される追加のデータセットが作成される場合があります。
(省略可能) コメントを追加します。
[接続の作成] をクリックします。
[Catalog basics] (カタログの基本) ページで、外部カタログの名前を入力します。 外部カタログは、外部データ システム内のデータベースをミラーリングし、Azure Databricks と Unity Catalog を使ってそのデータベース内のデータに対するクエリの実行とアクセス管理ができるようにします。
(オプション) 接続のテスト をクリックして、動作することを確認します。
[カタログ作成] をクリックします。
[アクセス] ページで、作成したカタログにユーザーがアクセスできるワークスペースを選びます。 [All workspaces have access] (すべてのワークスペースにアクセスできる) を選択することも、[ワークスペースに割り当て] をクリックし、ワークスペースを選択して [割り当てる] をクリックすることもできます。
カタログ内のすべてのオブジェクトへのアクセス件を管理できる [所有者] を変更します。 テキスト ボックスへのプリンシパルの入力を始め、返された結果からプリンシパルをクリックします。
カタログに対する特権を付与します。 [許可] をクリックします。
- カタログ内のオブジェクトにアクセスできる [プリンシパル] を指定します。 テキスト ボックスへのプリンシパルの入力を始め、返された結果からプリンシパルをクリックします。
- 各プリンシパルに付与する [Privilege presets] (特権のプリセット) を選びます。 既定では、すべてのアカウント ユーザーに
BROWSE
が付与されます。- カタログ内のオブジェクトに対する
read
特権を付与するには、ドロップダウン メニューから [データ リーダー] を選びます。 - カタログ内のオブジェクトに対する
read
特権とmodify
特権を付与するには、ドロップダウン メニューから [データ エディター] を選びます。 - 付与する特権を手動で選びます。
- カタログ内のオブジェクトに対する
- [許可] をクリックします。
次をクリックします。
[メタデータ] ページで、タグのキーと値のペアを指定します。 詳細については、「Unity Catalog のセキュリティ保護可能なオブジェクトにタグを適用する」を参照してください。
(省略可能) コメントを追加します。
[保存] をクリックします。
SQL
ノートブックまたは Databricks SQL クエリ エディターで次のコマンドを実行します。 <GoogleServiceAccountKeyJson>
を、BigQuery プロジェクトを指定して認証を提供する生の JSON オブジェクトに置き換えます。 この JSON オブジェクトを生成し、Google Cloud の [キー] の下にあるサービス アカウントの詳細ページからダウンロードできます。 サービス アカウントには、BigQuery ユーザーや BigQuery データ閲覧者など、BigQuery で適切なアクセス許可が付与されている必要があります。 JSON オブジェクトの例については、このページの [カタログ エクスプローラー] タブを確認してください。
CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
GoogleServiceAccountKeyJson '<GoogleServiceAccountKeyJson>'
);
資格情報などの機密性の高い値には、プレーンテキストの文字列ではなく Azure Databricks のシークレットを使用することをお勧めします。 次に例を示します。
CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
GoogleServiceAccountKeyJson secret ('<secret-scope>','<secret-key-user>')
)
シークレットの設定については、「シークレットの管理」を参照してください。
外部カタログを作成する
Note
UI を使ってデータ ソースへの接続を作成する場合は、外部カタログの作成が含まれます。このステップはスキップできます。
外部カタログは、外部データ システム内のデータベースをミラーリングし、Azure Databricks と Unity Catalog を使ってそのデータベース内のデータに対するクエリの実行とアクセス管理ができるようにします。 外部カタログを作成するには、定義済みのデータ ソースへの接続を使用します。
外部カタログを作成するには、Catalog Explorer か、Azure Databricks ノートブックまたは Databricks SQL クエリ エディターで CREATE FOREIGN CATALOG
を使用します。 Databricks REST API または Databricks CLI を使用してカタログを作成することもできます。 POST /api/2.1/unity-catalog/catalogs または Unity Catalog コマンドを参照してください。
必要なアクセス許可: メタストアに対する CREATE CATALOG
アクセス許可と、接続の所有権または接続に対する CREATE FOREIGN CATALOG
特権。
カタログ エクスプローラー
Azure Databricks ワークスペースで、
[カタログ] をクリックしてカタログ エクスプローラーを開きます。
[カタログ] ペインの上部にある
[追加] アイコンをクリックし、メニューから [カタログの追加] を選択します。
または、[クイック アクセス] ページで、[カタログ] ボタンをクリックし、[カタログの作成] ボタンをクリックします。
(オプション) 次のカタログ プロパティを入力します。
データ プロジェクト ID: このカタログにマッピングされるデータを含む BigQuery プロジェクトの名前。 既定では、接続レベルで設定された課金プロジェクト ID が設定されます。
「カタログを作成する」で外部カタログを作成する手順に従います。
SQL
ノートブックまたは Databricks SQL エディターで次の SQL コマンドを実行します。 角かっこ内の項目は省略可能です。 プレースホルダー値を置き換えます。
<catalog-name>
: Azure Databricks 内のカタログの名前。<connection-name>
: データ ソース、パス、アクセス資格情報を指定する接続オブジェクト。
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>;
サポートされているプッシュダウン
以下のプッシュダウンがサポートされています。
- フィルター
- プロジェクション
- 制限
- 関数: 部分的。フィルター式の場合のみ。 (文字列関数、数学関数、データ関数、時刻関数、タイムスタンプ関数、その他 Alias、Cast、SortOrder などの関数)
- 集計
- 制限付きで使用した場合の並べ替え
- 結合 (Databricks Runtime 16.1 以上)
以下のプッシュダウンはサポートされていません。
- Windows 関数
データ型マッピング
次の表に、BigQuery から Spark へのデータ型マッピングを示します。
BigQuery 型 | Spark の型 |
---|---|
bignumeric、numeric | DecimalType |
int64 | LongType |
float64 | DoubleType |
array、geography、interval、json、string、struct | VarcharType |
bytes | BinaryType |
[bool] | BooleanType |
date | DateType |
datetime、time、timestamp | TimestampType/TimestampNTZType |
BigQuery から読み取ると、Timestamp
(既定値) の場合、BigQuery の TimestampType
は Spark の preferTimestampNTZ = false
にマップされます。 BigQuery の Timestamp
は、TimestampNTZType
の場合、preferTimestampNTZ = true
にマップされます。