Analiza tablas de objetos mediante funciones remotas

En este documento, se describe cómo analizar datos no estructurados en tablas de objetos mediante funciones remotas.

Descripción general

Puedes analizar los datos no estructurados que representa una tabla de objetos mediante una función remota. Una función remota te permite llamar a una función que se ejecuta en Cloud Functions o Cloud Run, que puedes programar para acceder a recursos como los siguientes:

  • Los modelos de IA previamente entrenados de Google, incluidas la API de Cloud Vision y Document AI.
  • Bibliotecas de código abierto, como Apache Tika.
  • Tus propios modelos personalizados

Para analizar los datos de la tabla de objetos con una función remota, debes generar y pasar URLs firmadas para los objetos en la tabla de objetos cuando llamas a la función remota. Estas URLs firmadas son las que otorgan a la función remota acceso a los objetos.

Permisos necesarios

  • Para crear el recurso de conexión que usa la función remota, necesitas los siguientes permisos:

    • bigquery.connections.create
    • bigquery.connections.get
    • bigquery.connections.list
    • bigquery.connections.update
    • bigquery.connections.use
    • bigquery.connections.delete
  • Para crear un rol remoto, necesitas los permisos asociados con las funciones de Desarrollador de Cloud Functions o Desarrollador de Cloud Run.

  • Para invocar una función remota, necesitas los permisos que se describen en Funciones remotas.

  • Para analizar una tabla de objetos con una función remota, necesitas el permiso bigquery.tables.getData en la tabla de objetos.

Antes de comenzar

  1. Accede a tu cuenta de Google Cloud. Si eres nuevo en Google Cloud, crea una cuenta para evaluar el rendimiento de nuestros productos en situaciones reales. Los clientes nuevos también obtienen $300 en créditos gratuitos para ejecutar, probar y, además, implementar cargas de trabajo.
  2. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  3. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  4. Habilita las API de BigQuery, BigQuery Connection API, Cloud Functions.

    Habilita las API

  5. En la página del selector de proyectos de la consola de Google Cloud, selecciona o crea un proyecto de Google Cloud.

    Ir al selector de proyectos

  6. Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.

  7. Habilita las API de BigQuery, BigQuery Connection API, Cloud Functions.

    Habilita las API

  8. Asegúrate de que tu administrador de BigQuery cree una conexión y configure el acceso a Cloud Storage.

Crea una función remota

Para obtener instrucciones generales sobre cómo crear una función remota, consulta Trabaja con funciones remotas.

Cuando creas una función remota a fin de analizar los datos de la tabla de objetos, debes pasar las URLs firmadas que se generaron para los objetos en la tabla de objetos. Para ello, usa un parámetro de entrada con un tipo de datos STRING. Las URLs firmadas están disponibles para la función remota como datos de entrada en el campo calls de la solicitud HTTP POST. A continuación, se presenta un ejemplo de una solicitud:

{
  // Other fields omitted.
  "calls": [
    ["https://storage.googleapis.com/mybucket/1.pdf?X-Goog-SignedHeaders=abcd"],
    ["https://storage.googleapis.com/mybucket/2.pdf?X-Goog-SignedHeaders=wxyz"]
  ]
}

Puedes leer un objeto en tu función remota si usas un método que realice una solicitud HTTP GET a la URL firmada. La función remota puede acceder al objeto porque la URL firmada contiene información de autenticación en su string de consulta.

Cuando especifiques la declaración CREATE FUNCTION para la función remota, te recomendamos que configures la opción max_batching_rows en 1 a fin de Evita el tiempo de espera de Cloud Functions y aumenta el paralelismo de procesamiento.

Ejemplo

En el siguiente ejemplo de código de Python para Cloud Functions, se leen objetos de almacenamiento y se muestra su longitud de contenido en BigQuery:

import functions_framework
import json
import urllib.request

@functions_framework.http
def object_length(request):
  calls = request.get_json()['calls']
  replies = []
  for call in calls:
    object_content = urllib.request.urlopen(call[0]).read()
    replies.append(len(object_content))
  return json.dumps({'replies': replies})

Implementada, esta función tendría un extremo similar a https://us-central1-myproject.cloudfunctions.net/object_length.

En el siguiente ejemplo, se muestra cómo crear una función remota de BigQuery basada en esta función de Cloud Functions:

CREATE FUNCTION mydataset.object_length(signed_url STRING) RETURNS INT64
REMOTE WITH CONNECTION `us.myconnection`
OPTIONS(
  endpoint = "https://us-central1-myproject.cloudfunctions.net/object_length",
  max_batching_rows = 1
);

Para obtener orientación paso a paso, consulta Instructivo: Analiza una tabla de objetos con una función remota.

Llama a una función remota

Para llamar a una función remota en los datos de la tabla de objetos, haz referencia a la función remota en la select_list de la consulta y, luego, llama a Función EXTERNAL_OBJECT_TRANSFORM en la cláusula FROM a fin de generar las URLs firmadas para los objetos.

En el siguiente ejemplo, se muestra la sintaxis de una declaración típica:

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
LIMIT 10000;

En el siguiente ejemplo, se muestra cómo procesar solo un subconjunto del contenido de la tabla de objetos con una función remota:

SELECT uri, function_name(signed_url) AS function_output
FROM EXTERNAL_OBJECT_TRANSFORM(TABLE my_dataset.object_table, ["SIGNED_URL"])
WHERE content_type = "application/pdf";

¿Qué sigue?