Analisar tabelas de objetos usando funções remotas

Neste documento, descrevemos como analisar dados não estruturados em tabelas de objetos usando funções remotas.

Visão geral

É possível analisar os dados não estruturados representados por uma tabela de objetos usando uma função remota. Uma função remota permite chamar uma função em execução no Cloud Functions ou no Cloud Run, que você pode programar para acessar recursos como:

  • Modelos de IA pré-treinados do Google, incluindo a API Cloud Vision e a Document AI.
  • Bibliotecas de código aberto, como Apache Tika.
  • Seus próprios modelos personalizados.

Para analisar os dados da tabela de objetos usando uma função remota, é necessário gerar e transmitir URLs assinados para os objetos na tabela de objetos ao chamar a função remota. Esses URLs assinados concedem à função remota acesso aos objetos.

Permissões necessárias

  • Para criar o recurso de conexão usado pela função remota, você precisa das seguintes permissões:

    • bigquery.connections.create
    • bigquery.connections.get
    • bigquery.connections.list
    • bigquery.connections.update
    • bigquery.connections.use
    • bigquery.connections.delete
  • Para criar uma função remota, você precisa das permissões associadas aos papéis de Desenvolvedor do Cloud Functions ou Desenvolvedor do Cloud Run.

  • Para invocar uma função remota, você precisa das permissões descritas em Funções remotas.

  • Para analisar uma tabela de objetos com uma função remota, você precisa da permissão bigquery.tables.getData na tabela de objetos.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs BigQuery, BigQuery Connection API, Cloud Functions.

    Ative as APIs

  5. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  6. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  7. Ative as APIs BigQuery, BigQuery Connection API, Cloud Functions.

    Ative as APIs

  8. Verifique se o administrador do BigQuery criou uma conexão e configurou o acesso ao Cloud Storage.

Criar uma função remota

Para instruções gerais sobre como criar uma função remota, consulte Como trabalhar com funções remotas.

Ao criar uma função remota para analisar dados da tabela de objetos, transmita URLs assinados que foram gerados para os objetos na tabela de objetos. Para isso, use um parâmetro de entrada com um tipo de dados STRING. Os URLs assinados são disponibilizados à função remota como dados de entrada no campo calls da solicitação POST HTTP. Veja um exemplo de solicitação:

{
  // 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"]
  ]
}

É possível ler um objeto na função remota usando um método que faz uma solicitação GET HTTP ao URL assinado. A função remota pode acessar o objeto porque o URL assinado contém informações de autenticação na string de consulta.

Ao especificar a instrução CREATE FUNCTION para a função remota, recomendamos que você defina a opção max_batching_rows como 1 para evitar o tempo limite do Cloud Functions e aumentar o paralelismo de processamento.

Exemplo

O exemplo de código Python do Cloud Functions a seguir lê objetos de armazenamento e retorna o comprimento do conteúdo deles para o 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})

Implantada, essa função teria um endpoint semelhante a https://us-central1-myproject.cloudfunctions.net/object_length.

Veja no exemplo a seguir como criar uma função remota do BigQuery com base nessa função do 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 instruções passo a passo, consulte Tutorial: analisar uma tabela de objetos com uma função remota.

Chamar uma função remota

Para chamar uma função remota em dados de tabelas de objetos, faça referência à função remoto noselect_list da consulta e, em seguida, chame a EXTERNAL_OBJECT_TRANSFORM função na FROM cláusula para gerar os URLs assinados dos objetos.

O exemplo a seguir mostra a sintaxe típica de instruções:

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

O exemplo a seguir mostra como processar apenas um subconjunto do conteúdo da tabela de objetos com uma função 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";

A seguir