Utiliser des fonctions distantes
Une fonction distante BigQuery vous permet de mettre en œuvre votre fonction dans d'autres langages que SQL et JavaScript, ou avec des bibliothèques ou services non autorisés dans les fonctions définies par l'utilisateur BigQuery.
Présentation
Une fonction distante BigQuery vous permet d'intégrer des fonctionnalités GoogleSQL dans des logiciels externes à BigQuery grâce à une intégration directe de Cloud Functions et Cloud Run. Avec les fonctions à distance de BigQuery, vous pouvez déployer vos fonctions dans Cloud Functions ou Cloud Run en utilisant n'importe quel langage compatible, puis les appeler à partir de requêtes GoogleSQL.
Workflow
- Créez le point de terminaison HTTP dans Cloud Functions ou Cloud Run.
- Créez une fonction distante dans BigQuery.
- Créez une connexion de type
CLOUD_RESOURCE
. - Créez une fonction distante.
- Créez une connexion de type
- Utilisez la fonction distante dans une requête comme n'importe quelle autre fonction définie par l'utilisateur.
Limites
Les fonctions distantes ne sont compatibles qu'avec l'un des types de données suivants, en tant que type d'argument ou type renvoyé :
- Booléen
- Octets
- Numérique
- Chaîne
- Date
- Date/Heure
- Heure
- Horodatage
- JSON
Les fonctions distantes ne sont pas compatibles avec les types
ARRAY
,STRUCT
,INTERVAL
ouGEOGRAPHY
.Vous ne pouvez pas créer de fonctions distantes temporaires.
Vous ne pouvez pas créer de fonctions distantes basées sur des valeurs de table.
Vous ne pouvez pas utiliser de fonctions distantes lors de la création de vues matérialisées.
La valeur renvoyée par une fonction distante est toujours considérée comme non déterministe. Par conséquent, le résultat d'une requête appelant une fonction distante n'est pas mis en cache.
Des requêtes répétées avec les mêmes données vers votre point de terminaison peuvent s'afficher, même après des réponses réussies, en raison d'erreurs réseau temporaires ou d'erreurs internes BigQuery.
Lorsqu'une évaluation de fonction distante est ignorée pour certaines lignes en raison d'un court-circuit, par exemple, dans Expressions conditionnelles ou une instruction
MERGE
avecWHEN [NOT] MATCHED
, le traitement par lot n'est pas utilisé avec la fonction distante. Dans ce cas, le champcalls
du corps de la requête HTTP contient exactement un élément.Si l'ensemble de données associé à la fonction distante est répliqué dans une région de destination via la réplication interrégionale d'ensembles de données, la fonction distante ne peut être interrogée que dans la région dans laquelle il a été créé.
Créer un point de terminaison
Pour créer une fonction distante capable de mettre en œuvre une logique métier, vous devez créer un point de terminaison HTTP à l'aide de Cloud Functions ou de Cloud Run. Le point de terminaison doit pouvoir traiter un lot de lignes dans une seule requête HTTP POST et renvoyer les résultats du lot sous forme de réponse HTTP.
Si vous créez la fonction distante à l'aide de BigQuery DataFrames, vous n'avez pas besoin de créer manuellement le point de terminaison HTTP. Le service le fait automatiquement.
Consultez le tutoriel Cloud Functions et la documentation Cloud Functions pour découvrir comment écrire, déployer, tester et gérer une fonction Cloud.
Consultez le guide de démarrage rapide de Cloud Run et les autres documents sur Cloud Run pour savoir comment écrire, déployer, tester et gérer un service Cloud Run.
Il est recommandé de conserver l'authentification par défaut au lieu d'autoriser les appels non authentifiés de votre fonction Cloud ou de votre service Cloud Run.
Format d'entrée
BigQuery envoie des requêtes HTTP POST avec un corps JSON au format suivant :
Nom du champ | Description | Type de champ |
---|---|---|
requestId | ID de la requête. Unique sur plusieurs requêtes envoyées à ce point de terminaison dans une requête GoogleSQL. | Toujours fourni. Chaîne. |
appelant | Nom complet de la ressource de tâche pour la requête GoogleSQL appelant la fonction distante. | Toujours fourni. Chaîne. |
sessionUser | Adresse e-mail de l'utilisateur exécutant la requête GoogleSQL. | Toujours fourni. Chaîne. |
userDefinedContext | Contexte défini par l'utilisateur utilisé lors de la création de la fonction distante dans BigQuery. | Facultatif. Objet JSON avec des paires clé/valeur. |
calls | Un lot de données d'entrée. | Toujours fourni. Un tableau JSON.
Chaque élément lui-même est un tableau JSON, qui est une liste d'arguments encodés au format JSON d'un appel de fonction distante. |
Exemple de requête :
{
"requestId": "124ab1c",
"caller": "//bigquery.googleapis.com/projects/myproject/jobs/myproject:US.bquxjob_5b4c112c_17961fafeaf",
"sessionUser": "test-user@test-company.com",
"userDefinedContext": {
"key1": "value1",
"key2": "v2"
},
"calls": [
[null, 1, "", "abc"],
["abc", "9007199254740993", null, null]
]
}
Format de sortie
BigQuery s'attend à ce que le point de terminaison renvoie une réponse HTTP au format suivant. Sinon, BigQuery ne pourra pas la consommer et fera échouer la requête appelant la fonction distante.
Nom du champ | Description | Plage de valeurs |
replies | Un lot de valeurs de retour. | Obligatoire pour une réponse positive. Un tableau JSON.
Chaque élément correspond à une valeur de retour de la fonction externe au format JSON.
La taille du tableau doit correspondre à celle du tableau JSON de |
errorMessage | Message d'erreur lorsqu'un code de réponse HTTP autre que 200 est renvoyé. Pour les erreurs ne permettant aucune autre tentative, nous le renvoyons dans le message d'erreur de la tâche BigQuery qui est envoyée à l'utilisateur. | Facultatif. Chaîne. La taille doit être inférieure à 1 Ko. |
Voici un exemple de réponse positive :
{
"replies": [
1,
0
]
}
Exemple de réponse ayant échoué :
{
"errorMessage": "Received but not expected that the argument 0 be null".
}
Code de réponse HTTP
Votre point de terminaison doit renvoyer le code de réponse HTTP 200 pour obtenir une réponse positive. Lorsque BigQuery reçoit une autre valeur, il considère la réponse comme un échec et effectue une nouvelle tentative lorsque le code de réponse HTTP est 408, 429, 500, 503 ou 504 jusqu'à une certaine limite interne.
Encodage JSON pour le type de données SQL
L'encodage JSON dans la requête/réponse HTTP suit l'encodage JSON BigQuery existant pour la fonction TO_JSON_STRING.
Exemple de code de fonction Cloud
L'exemple de code Python suivant met en œuvre l'ajout de tous les arguments entiers de la fonction distante. Il traite une requête avec les arguments des appels par lot et renvoie tous les résultats dans une réponse.
import functions_framework
from flask import jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
@functions_framework.http
def batch_add(request):
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return_json = jsonify( { "replies": replies } )
return return_json
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
Si la fonction est déployée dans le projet my_gcf_project
dans la région us-east1
avec le nom de fonction remote_add
, alors elle est accessible via le point de terminaison https://us-east1-my_gcf_project.cloudfunctions.net/remote_add
.
Exemple de code Cloud Run
L'exemple de code Python suivant implémente un service Web, qui peut être créé et déployé sur Cloud Run pour la même fonctionnalité.
import os
from flask import Flask, request, jsonify
# Max INT64 value encoded as a number in JSON by TO_JSON_STRING. Larger values are encoded as
# strings.
# See https://cloud.google.com/bigquery/docs/reference/standard-sql/json_functions#json_encodings
_MAX_LOSSLESS=9007199254740992
app = Flask(__name__)
@app.route("/", methods=['POST'])
def batch_add():
try:
return_value = []
request_json = request.get_json()
calls = request_json['calls']
for call in calls:
return_value.append(sum([int(x) if isinstance(x, str) else x for x in call if x is not None]))
replies = [str(x) if x > _MAX_LOSSLESS or x < -_MAX_LOSSLESS else x for x in return_value]
return jsonify( { "replies" : replies } )
except Exception as e:
return jsonify( { "errorMessage": str(e) } ), 400
if __name__ == "__main__":
app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
Consultez le guide de création et de déploiement du code.
Si le service Cloud Run est déployé dans le projet my_gcf_project
dans la région us-east1
comme nom de service remote_add
, il est accessible via le point de terminaison https://remote_add-<project_id_hash>-ue.a.run.app
.
Créer une fonction distante
BigQuery utilise une connexion CLOUD_RESOURCE
pour interagir avec votre fonction Cloud. Pour créer une fonction distante, vous devez créer une connexion CLOUD_RESOURCE
. Si vous créez une fonction distante à l'aide de BigQuery DataFrames et que le rôle d'administrateur de projet IAM (roles/resourcemanager.projectIamAdmin
) vous a été attribué, vous n'avez pas besoin de créer manuellement la connexion et de lui accorder l'accès. Le service le fait automatiquement.
Créer une connexion
Vous devez disposer d'une connexion à une ressource cloud pour vous connecter à Cloud Functions et à Cloud Run.
Sélectionnez l'une des options suivantes :
Console
Accédez à la page BigQuery.
Pour créer une connexion, cliquez sur
Ajouter, puis sur Connexions aux sources de données externes.Dans la liste Type de connexion, sélectionnez Modèles distants Vertex AI, fonctions distantes et BigLake (ressource Cloud).
Dans le champ ID de connexion, saisissez un nom pour votre connexion.
Cliquez sur Créer une connexion.
Cliquez sur Accéder à la connexion.
Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.
bq
Dans un environnement de ligne de commande, créez une connexion :
bq mk --connection --location=REGION --project_id=PROJECT_ID \ --connection_type=CLOUD_RESOURCE CONNECTION_ID
Le paramètre
--project_id
remplace le projet par défaut.Remplacez les éléments suivants :
REGION
: votre région de connexionPROJECT_ID
: ID de votre projet Google CloudCONNECTION_ID
: ID de votre connexion
Lorsque vous créez une ressource de connexion, BigQuery crée un compte de service système unique et l'associe à la connexion.
Dépannage : Si vous obtenez l'erreur de connexion suivante, mettez à jour le Google Cloud SDK :
Flags parsing error: flag --connection_type=CLOUD_RESOURCE: value should be one of...
Récupérez et copiez l'ID du compte de service pour l'utiliser lors d'une prochaine étape :
bq show --connection PROJECT_ID.REGION.CONNECTION_ID
Le résultat ressemble à ce qui suit :
name properties 1234.REGION.CONNECTION_ID {"serviceAccountId": "connection-1234-9u56h9@gcp-sa-bigquery-condel.iam.gserviceaccount.com"}
Terraform
Ajoutez la section suivante à votre fichier main.tf
.
## This creates a cloud resource connection. ## Note: The cloud resource nested object has only one output only field - serviceAccountId. resource "google_bigquery_connection" "connection" { connection_id = "CONNECTION_ID" project = "PROJECT_ID" location = "REGION" cloud_resource {} }Remplacez les éléments suivants :
CONNECTION_ID
: ID de votre connexionPROJECT_ID
: ID de votre projet Google CloudREGION
: votre région de connexion
Configurer l'accès
Vous devez accorder à la nouvelle connexion un accès en lecture seule au service Cloud Functions ou Cloud Run. Il n'est pas recommandé d'autoriser les appels non authentifiés pour votre service Cloud Functions ou Cloud Run.
Pour attribuer des rôles, procédez comme suit :
Accédez à la page IAM et administration.
Cliquez sur
Ajouter.La boîte de dialogue Ajouter des comptes principaux s'ouvre.
Dans le champ Nouveaux comptes principaux, saisissez l'ID du compte de service que vous avez copié précédemment.
Dans le champ Sélectionner un rôle, choisissez l'une des options suivantes :
- Si vous utilisez une fonction Cloud 1re génération, sélectionnez Fonction Cloud, puis Rôle Demandeur fonction Cloud.
- Si vous utilisez une fonction Cloud de 2e génération, sélectionnez Cloud Run, puis Rôle Demandeur Cloud Run.
- Si vous utilisez un service Cloud Run, choisissez Cloud Run, puis Rôle Demandeur Cloud Run.
Cliquez sur Enregistrer.
Créer une fonction distante
Pour créer une fonction distante, procédez comme suit :
SQL
Exécutez l'instruction CREATE FUNCTION
suivante dans BigQuery :
Dans la console Google Cloud, accédez à la page BigQuery.
Dans l'éditeur de requête, saisissez l'instruction suivante :
CREATE FUNCTION
PROJECT_ID.DATASET_ID
.remote_add(x INT64, y INT64) RETURNS INT64 REMOTE WITH CONNECTIONPROJECT_ID.LOCATION.CONNECTION_NAME
OPTIONS ( endpoint = 'ENDPOINT_URL' )Remplacez les éléments suivants :
DATASET_ID
: ID de votre ensemble de données BigQuery.ENDPOINT_URL
: URL du point de terminaison de fonction distante Cloud Functions ou Cloud Run.
Cliquez sur
Exécuter.
Pour en savoir plus sur l'exécution des requêtes, consultez Exécuter une requête interactive.
BigQuery DataFrames
BigQuery DataFrames est en version preview.
- Activez les API requises et assurez-vous de disposer des rôles requis, comme décrit dans la section Conditions requises de la page Fonctions distantes.
Utilisez le décorateur
remote_function
: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 scalar # functions into a BigQuery remote function. It requires the GCP project to # be set up appropriately and the user having sufficient privileges to use # them. One can find more details about the usage and the requirements via # `help` command. help(bpd.remote_function) # Read a table and inspect the column of interest. df = bpd.read_gbq("bigquery-public-data.ml_datasets.penguins") df["body_mass_g"].head(10) # Define a custom function, and specify the intent to turn it into a remote # function. It requires a BigQuery connection. If the connection is not # already created, BigQuery DataFrames will attempt to create one assuming # the necessary APIs and IAM permissions are setup in the project. In our # examples we would be using a pre-created connection named # `bigframes-rf-conn`. We will also set `reuse=False` to make sure we don't # step over someone else creating remote function in the same project from # the exact same source code at the same time. Let's try a `pandas`-like use # case in which we want to apply a user defined scalar 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.remote_function( [float], str, bigquery_connection="bigframes-rf-conn", reuse=False, ) def get_bucket(num): if not num: return "NA" boundary = 4000 return "at_or_above_4000" if num >= boundary else "below_4000" # Then we can apply the remote function 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"]].head(10) # The above operation was possible by doing all the computation on the # cloud. For that, there is a google cloud function deployed by serializing # the user code, and a BigQuery remote function created to call the cloud # function via the latter's http endpoint on the data in the DataFrame. # The BigQuery remote function created to support the BigQuery DataFrames # remote function can be located via a property `bigframes_remote_function` # set in the remote function object. print(f"Created BQ remote function: {get_bucket.bigframes_remote_function}") # The cloud function can be located via another property # `bigframes_cloud_function` set in the remote function object. print(f"Created cloud function: {get_bucket.bigframes_cloud_function}") # Warning: The deployed cloud function may be visible to other users with # sufficient privilege in the project, so the user should be careful about # having any sensitive data in the code that will be deployed as a remote # function. # Let's continue trying other potential use cases of remote functions. 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 remote function @bpd.remote_function( [str], str, bigquery_connection="bigframes-rf-conn", reuse=False ) def get_hash(input): import hashlib # handle missing value if input is None: input = "" encoded_input = input.encode() hash = hashlib.md5(encoded_input) return hash.hexdigest() # We can use this remote function in another `pandas`-like API `map` that # can be applied on a DataFrame df_redacted = df[["species", "island", "sex"]].map(get_hash) df_redacted.head(10)
Vous devez disposer de l'autorisation bigquery.routines.create
sur l'ensemble de données dans lequel vous créez la fonction distante, ainsi que de l'autorisation bigquery.connections.delegate
(disponible via le rôle Administrateur de connexion BigQuery) sur la connexion utilisée par la fonction distante.
Fournir un contexte défini par l'utilisateur
Vous pouvez spécifier user_defined_context
dans OPTIONS
sous la forme de paires clé-valeur, qui feront partie de chaque requête HTTP adressée au point de terminaison. Grâce au contexte défini par l'utilisateur, vous pouvez créer plusieurs fonctions distantes en réutilisant un point de terminaison unique qui se comporte différemment en fonction du contexte qui lui est transmis.
Les exemples suivants créent deux fonctions distantes qui utilisent le même point de terminaison pour chiffrer et déchiffrer les données BYTES
.
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.encrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "encryption")]
)
CREATE FUNCTION `PROJECT_ID.DATASET_ID`.decrypt(x BYTES)
RETURNS BYTES
REMOTE WITH CONNECTION `PROJECT_ID.LOCATION.CONNECTION_NAME`
OPTIONS (
endpoint = 'ENDPOINT_URL',
user_defined_context = [("mode", "decryption")]
)
Limiter le nombre de lignes dans une requête par lot
Vous pouvez spécifier max_batching_rows
dans OPTIONS
comme nombre maximal de lignes dans chaque requête HTTP, afin d'éviter de dépasser le délai d'expiration Cloud Functions. Si cette valeur n'est pas spécifiée, BigQuery décide du nombre de lignes incluses dans chaque lot.
Utiliser une fonction distante dans une requête
Assurez-vous d'avoir accordé l'autorisation sur votre fonction Cloud, afin qu'elle soit accessible au compte de service BigQuery associé à la connexion de la fonction distante.
Vous devez également disposer de l'autorisationbigquery.routines.get
sur l'ensemble de données où se trouve la fonction distante et de l'autorisation bigquery.connections.use
que vous pouvez obtenir via le rôle BigQuery Connection User
sur la connexion utilisée par la fonction distante.
Vous pouvez utiliser une fonction distante dans une requête de la même façon qu'une fonction définie par l'utilisateur.
Par exemple, vous pouvez utiliser la fonction remote_add
dans l'exemple de requête :
SELECT
val,
`PROJECT_ID.DATASET_ID`.remote_add(val, 2)
FROM
UNNEST([NULL,2,3,5,8]) AS val;
Cet exemple génère la sortie suivante :
+------+-----+
| val | f0_ |
+------+-----+
| NULL | 2 |
| 2 | 4 |
| 3 | 5 |
| 5 | 7 |
| 8 | 10 |
+------+-----+
Régions où le service est disponible
Il existe deux types de zones dans BigQuery :
Une région est un emplacement géographique spécifique, par exemple Londres.
Une zone multirégionale correspond à un secteur géographique de grande étendue, par exemple les États-Unis, et comporte au moins deux lieux géographiques.
Régions uniques
Dans un ensemble de données BigQuery régional unique, vous ne pouvez créer qu'une fonction distante utilisant une fonction Cloud déployée dans la même région. Exemple :
- Une fonction distante dans la région unique
us-east4
ne peut utiliser qu'une fonction Cloud dansus-east4
.
Ainsi, pour les régions uniques, les fonctions distantes ne sont disponibles que dans les régions compatibles à la fois avec Cloud Functions et BigQuery.
Emplacements multirégionaux
Dans un ensemble de données BigQuery multirégional (US
, EU
), vous ne pouvez créer une fonction distante que si elle utilise une fonction Cloud déployée dans une région située dans la même zone géographique (États-Unis, UE). Exemple :
- Une fonction distante dans la zone multirégionale BigQuery
US
ne peut utiliser qu'une fonction Cloud déployée dans une région unique de la zone géographique des États-Unis, par exempleus-central1
,us-east4
,us-west2
, etc. - Une fonction distante dans la zone multirégionale BigQuery
EU
ne peut utiliser qu'une fonction Cloud déployée dans une région unique des États membres de l'Union européenne, telle queeurope-north1
,europe-west3
, etc.
Pour en savoir plus sur les régions et les zones multirégionales BigQuery, consultez la page Emplacements des ensembles de données. Pour en savoir plus sur les régions Cloud Functions, consultez la page Emplacements des fonctions Cloud Functions.
Connexions
Pour une zone régionale ou multirégionale, vous ne pouvez créer une fonction distante que dans la zone utilisée pour la connexion. Par exemple, pour créer une fonction distante dans la zone multirégionale US
, utilisez une connexion située dans la zone multirégionale US
.
Tarifs
Les tarifs standards de BigQuery s'appliquent.
L'utilisation de cette fonctionnalité peut également entraîner des coûts liés à Cloud Functions et Cloud Run. Veuillez consulter les pages des tarifs de Cloud Functions et Cloud Run pour plus de détails.
Utiliser VPC Service Controls
VPC Service Controls est une fonctionnalité de Google Cloud qui vous permet de configurer un périmètre sécurisé pour vous protéger contre l'exfiltration de données. Pour utiliser VPC Service Controls avec des fonctions distantes afin de renforcer la sécurité, ou pour utiliser des points de terminaison avec les paramètres d'entrée internal traffic
, suivez le guide VPC Service Controls pour effectuer les opérations suivantes :
Créer un périmètre de service
Ajouter le projet BigQuery de la requête en utilisant la fonction distante dans le périmètre.
Ajouter le projet de point de terminaison au périmètre et définir
Cloud Functions API
ouCloud Run API
dans les services restreints en fonction du type de point de terminaison. Pour en savoir plus, consultez les pages VPC Service Controls dans Cloud Functions et VPC Service Controls dans Cloud Run.
Bonnes pratiques pour les fonctions distantes
Préfiltrer votre entrée : si votre entrée peut facilement être filtrée avant d'être transmise à une fonction distante, la requête sera probablement plus rapide et plus économique.
Assurez le scaling de votre fonction Cloud. Le scaling est une fonction du nombre minimal d'instances, du nombre maximal d'instances et de la simultanéité.
- Dans la mesure du possible, utilisez la valeur par défaut pour le nombre maximal d'instances de votre fonction Cloud Functions.
- Notez qu'il n'y a pas de limite par défaut pour les fonctions HTTP Cloud Functions de 1re génération. Pour éviter les événements de scaling illimité avec les fonctions HTTP Cloud Functions de 1re génération lors des tests ou en production, nous vous recommandons de définir une limite, par exemple 3 000.
Suivez d'autres conseils sur les fonctions Cloud pour améliorer les performances. Les requêtes de fonction distante interagissant avec une fonction Cloud à latence élevée peuvent échouer en raison du délai avant expiration.
Implémentez votre point de terminaison pour renvoyer un code de réponse HTTP et une charge utile appropriés en cas d'échec de réponse.
Pour réduire les tentatives de BigQuery, utilisez des codes de réponse HTTP autres que 408, 429, 500, 503 et 504 en cas d'échec de réponse, et veillez à intercepter toutes les exceptions dans votre code de fonction. Sinon, le framework de service HTTP peut renvoyer automatiquement un code 500 pour toute exception non détectée. Il se peut que des requêtes HTTP relancées s'affichent toujours lorsque BigQuery relance une partition de données ou une requête ayant échoué.
Votre point de terminaison doit renvoyer une charge utile JSON au format défini lors d'un échec de réponse. Même si ce n'est pas strictement obligatoire, il aide BigQuery à déterminer si la réponse ayant échoué est issue de la mise en œuvre de votre fonction ou de l'infrastructure de Cloud Functions/Cloud Run. Dans ce dernier cas, BigQuery peut réessayer avec une limite interne différente.
Quotas
Pour en savoir plus sur les quotas des fonctions distantes, consultez la page Quotas et limites.