Python のユーザー定義関数

Python ユーザー定義関数(UDF)を使用すると、Python でスカラー関数を実装し、SQL クエリで使用できます。Python UDF は SQL と JavaScript の UDF に似ていますが、追加機能があります。Python UDF を使用すると、Python Package Index(PyPI)からサードパーティ ライブラリをインストールし、Cloud リソース接続を使用して外部サービスにアクセスできます。

Python UDF は、BigQuery マネージド リソースでビルドされ、実行されます。

制限事項

  • サポートされているランタイムは python-3.11 のみです。
  • 一時的な Python UDF は作成できません。
  • マテリアライズド ビューでは Python UDF を使用できません。
  • Python UDF の戻り値は常に非確定的であると想定されるため、Python UDF を呼び出すクエリの結果はキャッシュに保存されません。
  • Python UDF は、INFORMATION_SCHEMA ビューでは完全にはサポートされていません。
  • Routine API を使用して Python UDF を作成または更新することはできません。
  • VPC Service Controls はサポートされていません。
  • 顧客管理の暗号鍵(CMEK)はサポートされていません。
  • JSONRANGEINTERVALGEOGRAPHY のデータ型はサポートされていません。
  • Python UDF を実行するコンテナは、2 vCPU と 8 Gi までしか構成できません。

必要な IAM のロール

必要な IAM ロールは、Python UDF オーナーか Python UDF ユーザーかによって異なります。通常、Python UDF オーナーは UDF を作成または更新します。Python UDF ユーザーは、他のユーザーが作成した UDF を呼び出します。

Cloud リソース接続を参照する Python UDF を作成または実行する場合は、追加のロールも必要です。

UDF オーナー

Python UDF を作成または更新する場合は、適切なリソースで次の IAM 事前定義ロールが付与されている必要があります。

ロール 必要な権限 リソース
BigQuery データ編集者roles/bigquery.dataEditor
  • bigquery.routines.create: CREATE FUNCTION ステートメントを使用して Python UDF を作成するため。
  • bigquery.routines.update: CREATE FUNCTION ステートメントを使用して Python UDF を更新するため。
Python UDF が作成または更新されるデータセット。
BigQuery ジョブユーザーroles/bigquery.jobUser
  • bigquery.jobs.create: CREATE FUNCTION ステートメントのクエリジョブを実行するため。
CREATE FUNCTION ステートメントを実行するプロジェクト。
BigQuery Connection 管理者roles/bigquery.connectionAdmin 外部リソースへのアクセス権を付与する接続。この接続は、UDF が WITH CONNECTION 句を使用して外部サービスにアクセスする場合にのみ必要です。

UDF ユーザー

Python UDF を呼び出す場合は、適切なリソースで次の IAM 事前定義ロールが付与されている必要があります。

ロール 必要な権限 リソース
BigQuery ユーザーroles/bigquery.user bigquery.jobs.create: UDF を参照するクエリジョブを実行するため。 Python UDF を呼び出すクエリジョブを実行するプロジェクト。
BigQuery データ閲覧者roles/bigquery.dataViewer bigquery.routines.get: 他のユーザーが作成した UDF を実行するため。 Python UDF が保存されているデータセット。
BigQuery Connection ユーザーroles/bigquery.connectionUser bigquery.connections.use: Cloud リソース接続を参照する Python UDF を実行するため。 Python UDF によって参照される Cloud リソース接続。この接続は、UDF が接続を参照する場合にのみ必要です。

BigQuery のロールの詳細については、IAM 事前定義ロールをご覧ください。

永続的な Python UDF を作成する

Python UDF を作成する際は、次のルールに従ってください。

  • Python UDF の本体は、Python コードを表す引用符付き文字列リテラルである必要があります。引用符付き文字列リテラルの詳細については、引用符付きリテラルの形式をご覧ください。

  • Python UDF の本体には、Python UDF オプション リストの entry_point 引数で使用される Python 関数を含める必要があります。

  • runtime_version オプションで Python ランタイム バージョンを指定する必要があります。サポートされている Python ランタイム バージョンは python-3.11 のみです。使用可能なオプションの一覧については、CREATE FUNCTION ステートメントの関数オプション リストをご覧ください。

永続的な Python UDF を作成するには、TEMP キーワードまたは TEMPORARY キーワードを指定せずに CREATE FUNCTION ステートメントを使用します。永続的な Python UDF を削除するには、DROP FUNCTION ステートメントを使用します。

CREATE FUNCTION ステートメントを使用して Python UDF を作成すると、BigQuery はベースイメージに基づくコンテナ イメージを作成または更新します。コンテナは、コードと指定されたパッケージ依存関係を使用してベースイメージ上にビルドされます。コンテナの作成は、実行時間が長いプロセスです。CREATE FUNCTION ステートメント実行後の最初のクエリは、イメージの作成を自動的に待機する場合があります。外部依存関係がない場合、通常、コンテナ イメージは 1 分以内に作成されます。

永続的な Python UDF を作成する例については、次のいずれかのオプションを選択してください。

コンソール

次の例では、multiplyInputs という名前の永続的な Python UDF を作成して、SELECT ステートメント内から呼び出しています。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.multiplyInputs(x FLOAT64, y FLOAT64)
    RETURNS FLOAT64
    LANGUAGE python
    OPTIONS(runtime_version="python-3.11", entry_point="multiply")
    AS r'''
    
    def multiply(x, y):
      return x * y
    
    ''';
    
    -- Call the Python UDF.
    WITH numbers AS
      (SELECT 1 AS x, 5 as y
      UNION ALL
      SELECT 2 AS x, 10 as y
      UNION ALL
      SELECT 3 as x, 15 as y)
    SELECT x, y,
    `PROJECT_ID.DATASET_ID`.multiplyInputs(x, y) AS product
    FROM numbers;

    PROJECT_ID.DATASET_ID はプロジェクト ID とデータセット ID に置き換えます。

  3. [実行] をクリックします。

    この例では、次の出力が生成されます。

    +-----+-----+--------------+
    | x   | y   | product      |
    +-----+-----+--------------+
    | 1   | 5   |  5.0         |
    | 2   | 10  | 20.0         |
    | 3   | 15  | 45.0         |
    +-----+-----+--------------+
    

BigQuery DataFrames

次の例では、BigQuery DataFrames を使用してカスタム関数を Python UDF に変換します。

import bigframes.pandas as bpd

# Set BigQuery DataFrames options
bpd.options.bigquery.project = your_gcp_project_id
bpd.options.bigquery.location = "US"

# BigQuery DataFrames gives you the ability to turn your custom functions
# into a BigQuery Python UDF. One can find more details about the usage and
# the requirements via `help` command.
help(bpd.udf)

# Read a table and inspect the column of interest.
df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")
df["body_mass_g"].peek(10)

# Define a custom function, and specify the intent to turn it into a
# BigQuery Python UDF. Let's try a `pandas`-like use case in which we want
# to apply a user defined function to every value in a `Series`, more
# specifically bucketize the `body_mass_g` value of the penguins, which is a
# real number, into a category, which is a string.
@bpd.udf(
    dataset=your_bq_dataset_id,
    name=your_bq_routine_id,
)
def get_bucket(num: float) -> str:
    if not num:
        return "NA"
    boundary = 4000
    return "at_or_above_4000" if num >= boundary else "below_4000"

# Then we can apply the udf on the `Series` of interest via
# `apply` API and store the result in a new column in the DataFrame.
df = df.assign(body_mass_bucket=df["body_mass_g"].apply(get_bucket))

# This will add a new column `body_mass_bucket` in the DataFrame. You can
# preview the original value and the bucketized value side by side.
df[["body_mass_g", "body_mass_bucket"]].peek(10)

# The above operation was possible by doing all the computation on the
# cloud through an underlying BigQuery Python UDF that was created to
# support the user's operations in the Python code.

# The BigQuery Python UDF created to support the BigQuery DataFrames
# udf can be located via a property `bigframes_bigquery_function`
# set in the udf object.
print(f"Created BQ Python UDF: {get_bucket.bigframes_bigquery_function}")

# If you have already defined a custom function in BigQuery, either via the
# BigQuery Google Cloud Console or with the `udf` decorator,
# or otherwise, you may use it with BigQuery DataFrames with the
# `read_gbq_function` method. More details are available via the `help`
# command.
help(bpd.read_gbq_function)

existing_get_bucket_bq_udf = get_bucket.bigframes_bigquery_function

# Here is an example of using `read_gbq_function` to load an existing
# BigQuery Python UDF.
df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins")
get_bucket_function = bpd.read_gbq_function(existing_get_bucket_bq_udf)

df = df.assign(body_mass_bucket=df["body_mass_g"].apply(get_bucket_function))
df.peek(10)

# Let's continue trying other potential use cases of udf. Let's say we
# consider the `species`, `island` and `sex` of the penguins sensitive
# information and want to redact that by replacing with their hash code
# instead. Let's define another scalar custom function and decorate it
# as a udf. The custom function in this example has external package
# dependency, which can be specified via `packages` parameter.
@bpd.udf(
    dataset=your_bq_dataset_id,
    name=your_bq_routine_id,
    packages=["cryptography"],
)
def get_hash(input: str) -> str:
    from cryptography.fernet import Fernet

    # handle missing value
    if input is None:
        input = ""

    key = Fernet.generate_key()
    f = Fernet(key)
    return f.encrypt(input.encode()).decode()

# We can use this udf in another `pandas`-like API `map` that
# can be applied on a DataFrame
df_redacted = df[["species", "island", "sex"]].map(get_hash)
df_redacted.peek(10)

# If the BigQuery routine is no longer needed, we can clean it up
# to free up any cloud quota
session = bpd.get_global_session()
session.bqclient.delete_routine(f"{your_bq_dataset_id}.{your_bq_routine_id}")

ベクトル化された Python UDF を作成する

ベクトル化を使用して、単一の行ではなく行のバッチを処理するように Python UDF を実装できます。ベクトル化により、クエリのパフォーマンスが向上します。

バッチ処理の動作を制御するには、CREATE OR REPLACE FUNCTION オプション リストmax_batching_rows オプションを使用して、各バッチの行数の上限を指定します。max_batching_rows を指定すると、BigQuery ではバッチ内の行数が max_batching_rows の上限までに規定されます。max_batching_rows が指定されていない場合、バッチに含める行数は自動的に決定されます。

ベクトル化された Python UDF には、アノテーションを付ける必要がある単一の pandas.DataFrame 引数があります。pandas.DataFrame 引数には、CREATE FUNCTION ステートメントで定義された Python UDF パラメータと同じ数の列があります。pandas.DataFrame 引数の列名は、UDF のパラメータと同じ名前です。

関数は、pandas.Series か、入力と同じ行数の単一列の pandas.DataFrame を返す必要があります。

次の例では、2 つのパラメータ(xy)を持つ multiplyInputs という名前のベクトル化された Python UDF を作成します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.multiplyVectorized(x FLOAT64, y FLOAT64)
    RETURNS FLOAT64
    LANGUAGE python
    OPTIONS(runtime_version="python-3.11", entry_point="vectorized_multiply")
    AS r'''
    import pandas as pd
    
    def vectorized_multiply(df: pd.DataFrame):
      return df['x'] * df['y']
    
    ''';

    PROJECT_ID.DATASET_ID はプロジェクト ID とデータセット ID に置き換えます。

    UDF の呼び出しは、前の例と同じです。

  3. [実行] をクリックします。

サポートされている Python UDF データ型

次の表に、BigQuery のデータ型、Python のデータ型、Pandas のデータ型のマッピングを示します。

BigQuery のデータ型 標準 UDF で使用される Python 組み込みデータ型 ベクトル化された UDF で使用される Pandas データ型 ベクトル化された UDF の ARRAY と STRUCT に使用される PyArrow データ型
BOOL bool BooleanDtype DataType(bool)
INT64 int Int64Dtype DataType(int64)
FLOAT64 float FloatDtype DataType(double)
STRING str StringDtype DataType(string)
BYTES bytes binary[pyarrow] DataType(binary)
TIMESTAMP

関数のパラメータ: datetime.datetime(UTC タイムゾーンが設定される)

関数の戻り値: datetime.datetime(任意のタイムゾーンが設定される)

関数のパラメータ: timestamp[us, tz=UTC][pyarrow]

関数の戻り値: timestamp[us, tz=*][pyarrow]\(any timezone\)

TimestampType(timestamp[us])(タイムゾーンあり)
DATE datetime.date date32[pyarrow] DataType(date32[day])
TIME datetime.time time64[pyarrow] Time64Type(time64[us])
DATETIME datetime.datetime(タイムゾーンなし) timestamp[us][pyarrow] TimestampType(timestamp[us])(タイムゾーンなし)
ARRAY list list<...>[pyarrow](要素のデータ型は pandas.ArrowDtype ListType
STRUCT dict struct<...>[pyarrow](フィールドのデータ型は pandas.ArrowDtype StructType

サポートされているランタイム バージョン

BigQuery Python UDF は python-3.11 ランタイムをサポートしています。この Python バージョンには、プリインストールされた追加パッケージがいくつか含まれています。システム ライブラリについては、ランタイム ベースイメージをご確認ください。

ランタイム バージョン Python バージョン 含まれるもの ランタイム ベースイメージ
python-3.11 Python 3.11 numpy 1.26.3
pyarrow 14.0.2
pandas 2.1.4
python-dateutil 2.8.2
google-22-full/python311

サードパーティ パッケージを使用する

CREATE FUNCTION オプション リストを使用すると、Python 標準ライブラリとプリインストール パッケージで提供されるモジュール以外のモジュールを使用できます。パッケージは Python Package Index(PyPI)からインストールできます。また、Cloud Storage から Python ファイルをインポートすることもできます。

Python Package Index からパッケージをインストールする

パッケージをインストールするときには、パッケージ名を指定する必要があります。必要に応じて、Python パッケージ バージョン指定子を使用してパッケージ バージョンを指定することもできます。パッケージがランタイムにある場合、CREATE FUNCTION オプション リストで特定のバージョンが指定されていない限り、そのパッケージが使用されます。パッケージ バージョンが指定されておらず、パッケージがランタイムにない場合は、利用可能な最新バージョンが使用されます。wheel バイナリ形式のパッケージのみがサポートされます。

次の例では、CREATE OR REPLACE FUNCTION オプション リストを使用して scipy パッケージをインストールする Python UDF を作成する方法を示します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.area(radius FLOAT64)
    RETURNS FLOAT64 LANGUAGE python
    OPTIONS (entry_point='area_handler', runtime_version='python-3.11', packages=['scipy==1.15.3'])
    AS r"""
    import scipy
    
    def area_handler(radius):
      return scipy.constants.pi*radius*radius
    """;
    
    SELECT `PROJECT_ID.DATASET_ID`.area(4.5);

    PROJECT_ID.DATASET_ID はプロジェクト ID とデータセット ID に置き換えます。

  3. [実行] をクリックします。

追加の Python ファイルをライブラリとしてインポートする

関数オプション リストを使用して、Cloud Storage から Python ファイルをインポートして Python UDF を拡張できます。

UDF の Python コードで import ステートメントの後に Cloud Storage オブジェクトのパスを指定することで、Cloud Storage から Python ファイルをモジュールとしてインポートできます。たとえば、gs://BUCKET_NAME/path/to/lib1.py をインポートする場合、import ステートメントは import path.to.lib1 になります。

Python ファイル名は Python 識別子にする必要があります。オブジェクト名に含まれる各 folder 名(/ の後の部分)が有効な Python 識別子である必要があります。ASCII 範囲内(U+0001~U+007F)では、次の文字を識別子で使用できます。

  • A~Z の英字(大文字と小文字)。
  • アンダースコア。
  • 0~9 の数字(ただし、識別子の最初の文字としては使用できません)。

次の例は、my_bucket という名前の Cloud Storage バケットから lib1.py クライアント ライブラリ パッケージをインポートする Python UDF を作成する方法を示しています。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.myFunc(a FLOAT64, b STRING)
    RETURNS STRING LANGUAGE python
    OPTIONS (
    entry_point='compute', runtime_version='python-3.11',
    library=['gs://my_bucket/path/to/lib1.py'])
    AS r"""
    import path.to.lib1 as lib1
    
    def compute(a, b):
      # doInterestingStuff is a function defined in
      # gs://my_bucket/path/to/lib1.py
      return lib1.doInterestingStuff(a, b);
    
    """;

    PROJECT_ID.DATASET_ID はプロジェクト ID とデータセット ID に置き換えます。

  3. [実行] をクリックします。

Python UDF のコンテナの上限を構成する

CREATE FUNCTION オプション リストを使用すると、Python UDF を実行するコンテナの CPU とメモリの上限を指定できます。

デフォルトでは、各コンテナ インスタンスに割り当てられるメモリは 512 MiB、割り当てられる CPU は 0.33 vCPU です。

次の例では、CREATE FUNCTION オプション リストを使用してコンテナの上限を指定し、Python UDF を作成します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.resizeImage(image BYTES)
    RETURNS BYTES LANGUAGE python
    OPTIONS (entry_point='resize_image', runtime_version='python-3.11',
    packages=['Pillow==11.2.1'], container_memory='2Gi', container_cpu=1)
    AS r"""
    import io
    from PIL import Image
    
    def resize_image(image_bytes):
      img = Image.open(io.BytesIO(image_bytes))
    
      resized_img = img.resize((256, 256), Image.Resampling.LANCZOS)
      output_stream = io.BytesIO()
      resized_img.convert('RGB').save(output_stream, format='JPEG')
      return output_stream.getvalue()
    """;

    PROJECT_ID.DATASET_ID はプロジェクト ID とデータセット ID に置き換えます。

  3. [実行] をクリックします。

サポートされている CPU 値

Python UDF は、0.331.0 の間の CPU の小数値と、12 の CPU の整数値をサポートしています。小数値の入力値は、コンテナに適用される前に小数点以下 2 桁に丸められます。

サポートされているメモリ値

Python UDF コンテナは、<integer_number><unit> 形式のメモリ値をサポートします。単位は、MiMGiG のいずれかの値にする必要があります。構成できる最小メモリ容量は 256 メビバイト(256 Mi)です。構成できる最大メモリ容量は 8 ギビバイト(8 Gi)です。

選択したメモリの値に基づいて、最小 CPU 量も指定する必要があります。次の表に、各メモリ値の最小 CPU 値を示します。

メモリ 最小 CPU
512 MiB or less 0.33
More than 512 MiB 0.5
More than 1 GiB 1
More than 4 GiB 2

Python コードで Google Cloud またはオンライン サービスを呼び出す

Python UDF は、Cloud リソース接続のサービス アカウントを使用して、 Google Cloud サービスまたは外部サービスにアクセスします。接続のサービス アカウントには、サービスにアクセスするための権限を付与する必要があります。必要な権限は、アクセスされるサービスと、Python コードから呼び出される API によって異なります。

Cloud リソース接続を使用せずに Python UDF を作成すると、ネットワーク アクセスをブロックする環境で関数が実行されます。UDF がオンライン サービスにアクセスする場合は、Cloud リソース接続を使用して UDF を作成する必要があります。そうしないと、ネットワーク アクセスがブロックされて、最終的に内部接続タイムアウトになります。

次の例は、Python UDF から Cloud Translation サービスにアクセスする方法を示しています。この例には 2 つのプロジェクトがあります。UDF と Cloud リソース接続を作成する my_query_project という名前のプロジェクトと、Cloud Translation を実行する my_translate_project という名前のプロジェクトです。

Cloud リソース接続を作成する

まず、my_query_project に Cloud リソース接続を作成します。Cloud リソース接続を作成するには、Cloud リソース接続を作成するの説明に沿って操作します。

接続を作成したらそれを開いて、[接続情報] ペインでサービス アカウント ID をコピーします。この ID は、接続の権限を構成するときに必要になります。接続リソースを作成すると、BigQuery は、一意のシステム サービス アカウントを作成し、それを接続に関連付けます。

接続のサービス アカウントにアクセス権を付与する

Cloud リソース接続のサービス アカウントにプロジェクトへのアクセス権を付与するには、サービス アカウントに my_query_projectService Usage ユーザー ロールroles/serviceusage.serviceUsageConsumer)を付与し、my_translate_projectCloud Translation API ユーザー ロールroles/cloudtranslate.user)を付与します。

  1. [IAM] ページに移動します。

    [IAM] に移動

  2. my_query_project が選択されていることを確認します。

  3. [アクセスを許可] をクリックします。

  4. [新しいプリンシパル] フィールドに、前の手順でコピーした Cloud リソース接続のサービス アカウント ID を入力します。

  5. [ロールを選択] フィールドで、[Service Usage] を選択し、[Service Usage ユーザー] を選択します。

  6. [保存] をクリックします。

  7. プロジェクト セレクタで my_translate_project を選択します。

  8. [IAM] ページに移動します。

    [IAM] に移動

  9. [アクセスを許可] をクリックします。

  10. [新しいプリンシパル] フィールドに、前の手順でコピーした Cloud リソース接続のサービス アカウント ID を入力します。

  11. [ロールを選択] フィールドで、[Cloud Translation] を選択し、[Cloud Translation API ユーザー] を選択します。

  12. [保存] をクリックします。

Cloud Translation サービスを呼び出す Python UDF を作成する

my_query_project で、Cloud リソース接続を使用して Cloud Translation サービスを呼び出す Python UDF を作成します。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次の CREATE FUNCTION ステートメントを入力します。

    CREATE FUNCTION `PROJECT_ID.DATASET_ID`.translate_to_es(x STRING)
    RETURNS STRING LANGUAGE python
    WITH CONNECTION `PROJECT_ID.REGION.CONNECTION_ID`
    OPTIONS (entry_point='do_translate', runtime_version='python-3.11', packages=['google-cloud-translate>=3.11', 'google-api-core'])
    AS r"""
    
    from google.api_core.retry import Retry
    from google.cloud import translate
    
    project = "my_translate_project"
    translate_client = translate.TranslationServiceClient()
    
    def do_translate(x : str) -> str:
    
        response = translate_client.translate_text(
            request={
                "parent": f"projects/{project}/locations/us-central1",
                "contents": [x],
                "target_language_code": "es",
                "mime_type": "text/plain",
            },
            retry=Retry(),
        )
        return response.translations[0].translated_text
    
    """;
    
    -- Call the UDF.
    WITH text_table AS
      (SELECT "Hello" AS text
      UNION ALL
      SELECT "Good morning" AS text
      UNION ALL
      SELECT "Goodbye" AS text)
    SELECT text,
    `PROJECT_ID.DATASET_ID`.translate_to_es(text) AS translated_text
    FROM text_table;

    次のように置き換えます。

    • PROJECT_ID.DATASET_ID: プロジェクト ID とデータセット ID
    • REGION.CONNECTION_ID: 接続のリージョンと接続 ID
  3. [実行] をクリックします。

    出力は次のようになります。

    +--------------------------+-------------------------------+
    | text                     | translated_text               |
    +--------------------------+-------------------------------+
    | Hello                    | Hola                          |
    | Good morning             | Buen dia                      |
    | Goodbye                  | Adios                         |
    +--------------------------+-------------------------------+
    

サポートされているロケーション

Python UDF は、すべての BigQuery のマルチリージョン ロケーションとリージョン ロケーションでサポートされています。

料金

Python UDF は追加料金なしで提供されます。

課金が有効化されると以下が適用されます。

  • Python UDF の料金は、BigQuery Services SKU を使用して課金されます。
  • 料金は、Python UDF が呼び出されたときに消費されるコンピューティングとメモリの量に比例します。
  • Python UDF のお客様には、UDF コンテナ イメージのビルドまたは再ビルドの費用も請求されます。この料金は、お客様のコードと依存関係を含むイメージのビルドに使用されるリソースに比例します。
  • Python UDF によって外部またはインターネット下り(外向き)ネットワークが発生した場合は、Cloud Networking のプレミアム ティアのインターネット下り(外向き)料金も発生します。