ルーティンの概要

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

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

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

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

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

検討すべき要素

ルーティンを選択するには、次の要素を考慮してください。ルーティンの種類ごとに説明します。

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

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

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

タスク

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

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

SQL または JavaScript UDF

SQL または JavaScript UDAF

BigQuery で汎用タスクを実行し、クラウド リソース接続を使用して外部システムと通信する関数を作成します。 Trusted Cloud 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 などのアプリケーションへのログの送信を行うことはできません。例外は、Cloud リソース接続を使用して外部サービスにアクセスできる Python UDF です。ただし、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 にできます。これは、関数が呼び出されたときに複数の引数型と一致する場合があります。

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

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

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

使用方法

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

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

テーブル関数

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

テーブル関数を使用すると、次のことができます。

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

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

リモート関数

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

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

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

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

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

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

ストアド プロシージャ

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

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

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

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

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

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

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