ルーティンの概要

このドキュメントでは、BigQuery で関数またはストアド プロシージャを作成するために使用するリソースタイプであるルーティンの選択す法について説明します。

サポートされているルーティン

BigQuery は次のルーティンをサポートしています。

ルーティンを選択する方法

このセクションでは、ルーティンを選択する際に考慮すべき要素について説明し、タスクごとにルーティンを比較します。

検討すべき要素

ルーティンを選択する際は、次の要素を考慮してください。これらの要素については、各ルーティンの種類のセクションで説明します。

  • 実装するタスクのタイプ。
  • 使用するプログラミング言語。
  • ルーティンに実装する永続性のタイプ(一時的か永続的)。
  • ルーチンに必要な再利用のタイプ(単一または複数のクエリ)。
  • パフォーマンスに関する注意事項。
  • 外部サービスへのアクセス。
  • ユーザーとのルーティンの共有。

タスク別にルーティンを比較する

次の表に、ルーティンの種類ごとに実行できるタスクの種類を示します。

タスク

ルーティンのリソースタイプ

BigQuery で汎用タスクを実行する関数を作成します。

SQL または JavaScript UDF

SQL または JavaScript UDAF

BigQuery で汎用タスクを実行し、クラウド リソース接続を使用して外部の Cloud de Confiance by S3NS システムと通信する関数を作成します。

Python UDF

データを集計する関数を作成します。

UDAF

パラメータを使用してテーブルを作成します。

テーブル関数

BigQuery でサポートされていない言語、ライブラリ、サービスを使用する関数を作成します。これらの関数は、Cloud Run functionsCloud Run に直接統合されます。

リモート関数

手続き型言語を使用して、1 つのクエリで複数のステートメントをマルチステートメント クエリとして実行します。マルチステートメント クエリを使用すると、次のことができます。

  • 共有状態の複数のステートメントを順番に実行します。
  • テーブルの作成や削除などの管理タスクを自動化します。
  • IFWHILE などのプログラミング構造を使用して、複雑なロジックを実装します。

BigQuery で Apache Spark 用のストアド プロシージャを作成して呼び出します。

ストアド プロシージャ

ユーザー定義関数(UDF)

UDF を使用すると、SQL 式、JavaScript コード、または Python コードを使用して関数を作成できます。UDF は入力列を受け取って入力に対するアクションを実行し、それらのアクションの結果を値として返します。

UDF は永続的または一時的として定義できます。永続的な UDF は複数のクエリで再利用できるのに対し、一時的な UDF は 1 つのクエリのスコープ内にのみ存在します。

カスタム マスキング ルーティンで使用する UDF を作成できます。この UDF は、列に UDF を適用してから、列の値を返します。カスタム マスキング ルーティンを作成すると、データポリシーを作成するのマスキング ルールのように使用できるようになります。

UDF の詳細については、次のリソースをご覧ください。

言語ベースの UDF

  • SQL ベースの UDF は、UDF が呼び出されるときに複数の引数型と一致する可能性があるテンプレート化された UDF パラメータをサポートしています。SQL UDF は、スカラー サブクエリの値を返すこともできます。
  • JavaScript ベースの UDF を使用すると、SQL クエリから JavaScript で記述されたコードを呼び出すことができます。
    • JavaScript UDF は通常、標準 SQL クエリよりも多くのスロット リソースを消費するため、ジョブのパフォーマンスが低下します。
    • 関数を SQL で表現できる場合は、コードを標準 SQL のクエリジョブとして実行するのが最適です。
  • Python ベースの UDF は、BigQuery マネージド リソースでビルドされ、実行されます。これらの UDF を使用すると、Python で関数を実装し、SQL クエリで使用できます。

コミュニティ提供の UDF

作成した UDF に加えて、コミュニティ提供の UDF は、bigquery-public-data.persistent_udfs 一般公開データセットとオープンソースの bigquery-utils GitHub リポジトリで提供されています。

ユーザー定義の集計関数(UDAF)

UDAF を使用すると、SQL または JavaScript コードを含む式を使用して集計関数を作成できます。UDAF は入力列を受け取り、行のグループに対して一度に計算を実行し、その結果を単一の値として返します。

UDAF でデータの変更や外部システムとの通信を行うことはできません。また、Google Cloud Observability などのアプリケーションにログを送信することもできません。

詳しくは、次のリソースをご覧ください。

SQL UDAF

SQL UDAF は通常、グループ内のすべての行の関数パラメータを集計します。ただし、NOT AGGREGATE キーワードを使用すると、関数パラメータを非集計として指定できます。非集約関数パラメータは、グループ内のすべての行に定数値を持つスカラー関数パラメータです。SQL UDAF には、集約パラメータと非集約パラメータの両方を含めることができます。

JavaScript UDAF

JavaScript UDAF には JavaScript ライブラリを含めることができます。JavaScript 関数本体には、JavaScript グローバル変数やカスタム関数などのカスタム JavaScript コードを含めることができます。

通常、JavaScript ベースの関数はより多くのリソースを使用するため、パフォーマンスのヒントを参照すると役立ちます。

JavaScript UDAF にはいくつかの制約があります。特定の型のエンコードのみが許可されており、シリアル化と逆シリアル化には要件があります。

UDF と UDAF を比較する

UDAF ではなく UDF を選択するかどうかは、実行しようとしている特定のタスクによって異なります。

  • 個々のデータ値に対して計算や変換を行うには、UDF を使用します。
  • データ値のグループに対して同じ処理を行うには、UDAF を使用します。

たとえば、数値の列の平均値を計算する場合は、UDAF を使用します。文字列の列を大文字に変換する場合は、UDF を使用します。

UDF と UDAF には次のような類似点があります。

  • UDF と UDAF では、データの変更や外部システムとの通信を行うことはできません。また、Google Cloud Observability などのアプリケーションにログを送信することもできません。Python UDF は Cloud リソース接続を使用して外部サービスにアクセスできます。ただし、Python UDF は VPC Service Controls または顧客管理の暗号鍵(CMEK)をサポートしていません。
  • UDAF には、UDF と同じ制限事項のほかにも、いくつかの制限事項があります。
  • UDF と UDAF には同じ割り当てと上限が適用されます。

UDF と UDAF には次の違いがあります。

属性

UDF

UDAF

定義

ユーザー定義関数(UDF)は入力列を受け取って入力に対するアクションを実行し、それらのアクションの結果を値として返します。

ユーザー定義の集計関数(UDAF)は、入力列を受け取り、行のグループに対して一度に計算を実行し、その結果を単一の値として返します。

サポートされている言語

SQL、JavaScript、Python

SQL と JavaScript

永続性

  • 一時的または永続的。
  • 永続的な UDF は複数のクエリで使用できます。
  • 一時的な UDF は 1 つのクエリでのみ使用できます。
  • Python UDF は永続的のみで、一時的なものにすることはできません。
  • 一時的または永続的。
  • 永続的な UDAF は複数のクエリで使用できます。
  • 一時的な UDAF は、1 つのクエリ、スクリプト、セッション、またはプロシージャでのみ使用できます。
  • 永続的な UDAF をオーナー間で共有し、安全に呼び出すことができます。

引数とデータ型

UDF は、BigQuery の GoogleSQL のデータ型に準拠するパラメータ値を受け入れます。SQL 型には JavaScript 型への直接マッピングが用意されているものと、用意されていないものがあります。JavaScript でサポートされている型をご覧ください。

SQL UDF の場合、パラメータ値は ANY TYPE にできます。これは、関数が呼び出されるときに複数の引数型と一致する可能性があります。

JavaScript UDF にのみ、クエリ結果をキャッシュに保存できるかどうかについてのヒントを BigQuery に提供する決定論的指定子があります。

SQL UDAF と JavaScript UDAF は、BigQuery の GoogleSQL のデータ型に準拠するパラメータ値を受け入れます。

関数パラメータは、集計または非集計にできます。

使用法

UDF は、データ クレンジング、変換、検証によく使用されます。

UDAF は、平均、合計、カウントなどの要約統計の計算によく使用されます。

テーブル関数

テーブル関数(テーブル値関数、TVF とも呼ばれます)は、テーブルを返す UDF です。テーブル関数は、テーブルを使用できる場所であればどこでも使用できます。テーブル関数はビューと似ていますが、テーブル関数ではパラメータを取得できます。

テーブル関数では、次の操作を行うことができます。

  • 複数のパラメータを渡します。
  • テーブルが有効なコンテキストでテーブル関数を呼び出します。
  • テーブル関数の出力を別のテーブルと結合します。
  • サブクエリでテーブル関数を使用します。

テーブル関数の詳細については、テーブル関数制限事項割り当てと上限をご覧ください。

リモート関数

リモート関数を使用すると、SQL と JavaScript 以外の言語で関数を実装したり、BigQuery UDF でサポートされていないライブラリやサービスを使用したりできます。

BigQuery リモート関数は、サポートされている言語を使用して Google SQL 関数を Cloud Run functionsCloud Run に統合し、Google SQL クエリからこれらの関数を呼び出します。

リモート関数で実行できるタスクの例を次に示します。

リモート関数を作成するには、次の手順が必要です。

  1. Cloud Run functions または Cloud Run で HTTP エンドポイントを作成します。
  2. CLOUD_RESOURCE 接続タイプを使用して、BigQuery にリモート関数を作成します。
  3. BigQuery の他の UDF と同様に、クエリ内でリモート関数を使用します。

リモート関数の詳細については、リモート関数制限事項割り当てと上限をご覧ください。

ストアド プロシージャ

SQL ストアド プロシージャは、他のクエリまたはストアド プロシージャから呼び出すことができるステートメントの集合です。プロシージャに名前を付けて、BigQuery データセットに保存します。

ストアド プロシージャは手続き型言語ステートメントをサポートしているため、変数の定義や制御フローの実装などを行うことができます。手続き型言語ステートメントの詳細については、手続き型言語のリファレンスをご覧ください。

ストアド プロシージャでは次のことができます。

  • 入力引数を受け取り、値を出力として返します。
  • 複数のユーザーが複数のデータセットのデータにアクセスしたり、データを変更できます。
  • マルチステートメント クエリが含まれています。

一部のストアド プロシージャは BigQuery に組み込まれているため、作成する必要はありません。これらをシステム プロシージャと呼びます。詳細については、システム プロシージャのリファレンスをご覧ください。

BigQuery の Spark 用ストアド プロシージャもサポートされています。これらの手順には割り当てと上限があります。

ストアド プロシージャの詳細については、SQL ストアド プロシージャをご覧ください。