execução de consultas federadas no Google BigQuery
Esta página descreve como configurar o lakehouse Federation para execução de consultas federadas em dados do BigQuery que não são gerenciados pelo Databricks. Para saber mais sobre a Federação Lakehouse, consulte Conecte-se a bancos de dados externos e catálogos
Para conectar-se ao seu banco de dados BigQuery usando o Lakehouse Federation, você deve criar o seguinte no seu metastore do Databricks Unity Catalog (os espaços de trabalho criados após 6 de março de 2024 já possuem um provisionamento automático de metastore Unity Catalog ):
- Uma conexão com seu banco de dados BigQuery.
- Um catálogo externo que espelha seu banco de dados BigQuery no Unity Catalog para que você possa usar a sintaxe de consulta do Unity Catalog e as ferramentas de governança de dados para gerenciar o acesso do usuário do Databricks ao banco de dados.
Requisitos
Para executar consultas federadas no BigQuery, crie uma conexão com BigQuery e um catálogo externo que espelhe seu banco de dados BigQuery . Em seguida, você pode consultar e gerenciar o uso de dados BigQuery Databricks e Unity Catalog. Requisitos adicionais de permissão são especificados em cada seção baseada em tarefas que se segue.
Requisitos do workspace:
- Espaço de trabalho preparado para o Catálogo do Unity.
Requisitos de computação:
- Network connectivity from your compute resource to the required Google endpoints. See Required endpoints and connectivity checks.
- O compute do Databricks deve usar o Databricks Runtime 16.1 ou acima e o modo de acesso standard ou dedicated (anteriormente compartilhado e de usuário único).
- SQL warehouses devem ser Pro ou Serverless.
Requisitos de autorização:
- Para criar uma conexão, você deve ter o privilégio
CREATE CONNECTIONno metastore Unity Catalog anexado ao workspace. - Para criar um catálogo externo é preciso ter a permissão
CREATE CATALOGno metastore e ser proprietário da conexão ou ter o privilégioCREATE FOREIGN CATALOGna conexão.
Endpoints necessários e verificações de conectividade
Your Databricks compute connects directly to Google APIs over HTTPS. BigQuery authenticates with a Google serviço account key, so the connector obtains and refreshes access tokens from the compute plane rather than the Databricks control plane. Allowlisting compute egress to the endpoints abaixo is therefore sufficient. If your compute has outbound network restrictions, allow these endpoints and confirm that compute can reach them before you create a connection or catalog.
Required endpoints
Permita a saída HTTPS (porta 443) do seu compute do Databricks para os seguintes endpoints do Google:
bigquery.googleapis.com: BigQuery REST API, used for metadata operações and the Test connection check.bigquerystorage.googleapis.com: BigQuery Storage API. O conector lê dados de tabela por meio da Storage API no Databricks Runtime 16.1 e acima, portanto, este endpoint é necessário para que as queries federadas retornem dados. Consulte Materialization.oauth2.googleapis.comandaccounts.google.com: Google authentication endpoints used to authenticate the connection's service account. These are the hosts in thetoken_uriandauth_urifields of the serviço account JSON. Your values might differ, so allow the hosts that appear in your downloaded file. See the authentication note in Create a connection.
If your compute uses a custom DNS server, make sure it can resolve each of these hostnames. On networks that route Google traffic through a restricted virtual IP, confirm that your *.googleapis.com configuration covers the googleapis.com Endpoint and that accounts.google.com also resolves.
The Test connection check exercises the BigQuery REST API and the authentication endpoints, but it doesn't read data through the Storage API. A passing test doesn't confirm that bigquerystorage.googleapis.com is reachable, which federated queries require on Databricks Runtime 16.1 and above. Use the connectivity check abaixo to validate every endpoint.
Validate connectivity from compute
Antes de criar uma conexão, confirme se o seu compute pode alcançar cada endpoint necessário. Execute a seguinte verificação a partir de um notebook anexado a um cluster todo-propósito que usa a mesma configuração de rede do compute do qual você planeja fazer a federação.
Um teste bem-sucedido confirma a acessibilidade apenas para o compute clássico que compartilha esse caminho de rede, como clusters todo-propósito, clusters de Jobs e SQL Warehouse pro. Os SQL warehouses serverless alcançam o Google por um caminho de saída serverless separado, portanto, um teste de cluster bem-sucedido não confirma a conectividade serverless. Para controlar e verificar a saída serverless, consulte O que é controle de saída serverless?.
-
Anexe um notebook a um cluster que use a configuração de rede de destino.
-
Execute o seguinte shell comando para testar a acessibilidade de cada endpoint:
Bash%sh
for host in bigquery.googleapis.com bigquerystorage.googleapis.com oauth2.googleapis.com accounts.google.com; do
nc -zv "$host" 443
done -
Confirm that each host reports a successful connection. A failure or timeout for any host means outbound traffic to that endpoint is blocked, or DNS resolution is failing on your compute.
Crie uma conexão
A conexão especifica um caminho e as credenciais para acessar um sistema de banco de dados externo. Para criar uma conexão, você pode usar o Catalog Explorer ou o comando CREATE CONNECTION do SQL em um Notebook do Databricks ou no editor de consultas SQL do Databricks.
O senhor também pode usar a API REST da Databricks ou a CLI da Databricks para criar uma conexão. Veja POST /api/2.1/unity-catalog/connections e Unity Catalog comando.
Permissões necessárias: Administrador do Metastore ou usuário com o privilégio CREATE CONNECTION.
- Catalog Explorer
- SQL
-
Em seu site Databricks workspace, clique em
Catalog .
-
Na parte superior do painel Catálogo , clique em
Adicione o ícone e selecione "Criar uma conexão" no menu.
-
Na página Noções básicas de conexão do assistente de configuração de conexão , insira um nome de conexão fácil de usar.
-
Selecione um tipo de conexão do Google BigQuery e clique em Next (Avançar ).
-
Na página Authentication (Autenticação ), digite o serviço do Google account key JSONpara sua instância BigQuery.
Esse é um objeto JSON bruto usado para especificar o projeto BigQuery e fornecer autenticação. O senhor pode gerar esse objeto JSON e download a partir da página de detalhes do serviço account no Google Cloud em "key". O serviço account deve ter as permissões adequadas concedidas em BigQuery, incluindo BigQuery User e BigQuery Data Viewer . Veja a seguir um exemplo.
JSON{
"type": "service_account",
"project_id": "PROJECT_ID",
"private_key_id": "KEY_ID",
"private_key": "PRIVATE_KEY",
"client_email": "SERVICE_ACCOUNT_EMAIL",
"client_id": "CLIENT_ID",
"auth_uri": "https://accounts.google.com/o/oauth2/auth",
"token_uri": "https://oauth2.googleapis.com/token",
"auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
"client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/SERVICE_ACCOUNT_EMAIL",
"universe_domain": "googleapis.com"
}
O Google define os valores de URL no JSON da conta de serviço, e eles podem variar por account. Use-os exatamente como aparecem no seu arquivo JSON download. Se você configurar regras de proxy de rede para o Databricks alcançar as APIs do Google, permita tanto https://accounts.google.com quanto https://oauth2.googleapis.com. Para ver a lista completa de Endpoint do Google necessários e como validar a conectividade a partir do compute, consulte Endpoint necessários e verificações de conectividade.
-
(Opcional) Insira o ID do projeto para sua instância do BigQuery:
Esse é um nome para o projeto BigQuery usado para o faturamento de todas as consultas executadas sob essa conexão. padrão para o ID do projeto de seu serviço account. O serviço account deve ter as permissões adequadas concedidas para esse projeto em BigQuery, incluindo o usuárioBigQuery . dataset adicionais usados para armazenar tabelas temporárias por BigQuery podem ser criados neste projeto.
-
(Opcional) Adicione um comentário.
-
Clique em Criar conexão .
-
Na página Noções básicas do catálogo , insira um nome para o catálogo estrangeiro. Um catálogo externo espelha um banco de dados em um sistema de dados externo para que o senhor possa consultar e gerenciar o acesso aos dados desse banco de dados usando o Databricks e o Unity Catalog.
-
(Opcional) Clique em Testar conexão para confirmar se está funcionando.
-
Clique em Criar catálogo .
-
Na página Access (Acesso) , selecione o espaço de trabalho no qual os usuários podem acessar o catálogo que o senhor criou. O senhor pode selecionar All workspace have access (Todos os espaços de trabalho têm acesso ) ou clicar em Assign to workspace (Atribuir ao espaço de trabalho), selecionar o espaço de trabalho e clicar em Assign (Atribuir ).
-
Altere o proprietário que poderá gerenciar o acesso a todos os objetos no catálogo. começar a digitar um diretor na caixa de texto e, em seguida, clicar no diretor nos resultados retornados.
-
Conceda privilégios no catálogo. Clique em Conceder :
-
Especifique os diretores que terão acesso aos objetos no catálogo. começar a digitar um diretor na caixa de texto e, em seguida, clicar no diretor nos resultados retornados.
-
Selecione as predefinições de privilégios a serem concedidas a cada diretor. Todos os usuários de account recebem
BROWSEpor default.- Selecione Leitor de dados no menu suspenso para conceder privilégios
readem objetos no catálogo. - Selecione Editor de dados no menu suspenso para conceder os privilégios
reademodifyaos objetos no catálogo. - Selecione manualmente os privilégios a serem concedidos.
- Selecione Leitor de dados no menu suspenso para conceder privilégios
-
Clique em Conceder .
-
-
Clique em Avançar .
-
Na página Metadata (Metadados ), especifique as tags em key-value. Para obter mais informações, consulte Apply tags to Unity Catalog securable objects.
-
(Opcional) Adicione um comentário.
-
Clique em Salvar .
Execute o seguinte comando em um Notebook ou no editor de consultas Databricks SQL. Substitua <GoogleServiceAccountKeyJson> por um objeto JSON bruto que especifica o projeto BigQuery e fornece autenticação. O senhor pode gerar esse objeto JSON e download a partir da página de detalhes do serviço account no Google Cloud em "key". O serviço account precisa ter as permissões adequadas concedidas em BigQuery, incluindo BigQuery User e BigQuery Data Viewer. Para ver um exemplo de objeto JSON, view o Catalog Explorer tab nesta página.
CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
GoogleServiceAccountKeyJson '<GoogleServiceAccountKeyJson>'
);
A Databricks recomenda que você use segredos em vez de strings de texto simples para valores sensíveis, como credenciais. Por exemplo:
CREATE CONNECTION <connection-name> TYPE bigquery
OPTIONS (
GoogleServiceAccountKeyJson secret ('<secret-scope>','<secret-key-user>')
)
Para obter informações sobre a configuração de segredos, consulte Gerenciamento de segredos.
Crie um catálogo estrangeiro
Se o senhor usar a interface do usuário para criar uma conexão com a fonte de dados, a criação do catálogo externo estará incluída e o senhor poderá ignorar essa etapa.
Um catálogo externo espelha um banco de dados em um sistema de dados externo para que o senhor possa consultar e gerenciar o acesso aos dados desse banco de dados usando o Databricks e o Unity Catalog. Para criar um catálogo externo, use uma conexão com a fonte de dados que já foi definida.
Para criar um catálogo externo, o senhor pode usar o Catalog Explorer ou CREATE FOREIGN CATALOG em um Notebook Databricks ou o editor de consultas Databricks SQL. O senhor também pode usar a API REST da Databricks ou a CLI da Databricks para criar um catálogo. Veja POST /api/2.1/unity-catalog/catalogs ou Unity Catalog comando.
Permissões necessárias: permissão CREATE CATALOG na metastore e propriedade da conexão ou o privilégio CREATE FOREIGN CATALOG na conexão.
- Catalog Explorer
- SQL
-
Em seu site Databricks workspace, clique em
Catalog para abrir o Catalog Explorer.
-
Na parte superior do painel Catálogo , clique no ícone
Adicionar e selecione Adicionar um catálogo no menu.
Como alternativa, na página de acesso rápido , clique no botão Catálogos e no botão Criar catálogo .
-
(Opcional) Insira a seguinte propriedade do catálogo:
ID do projeto de dados : Um nome para o projeto do BigQuery que contém dados que serão mapeados para esse catálogo. padrão para o ID do projeto de faturamento definido no nível da conexão.
-
Siga as instruções para criar catálogos estrangeiros em Criar catálogos.
-
(Opcional) Especifique as seguintes opções de catálogo:
Materialization Dataset: Um nome de conjunto de dados opcional do BigQuery a ser usado para materializar os resultados da consulta. Caso não seja especificado, um conjunto de dados de materialização é provisionado automaticamente quando necessário. Veja Materialização para mais informações.Force materialization: Indica se os resultados de cada query ao catálogo devem ser exibidos. O default éfalse. Consulte a seção Materialização para obter mais informações.BIGNUMERIC Default Scale: Um valor de escala opcional para mapear BigQueryBIGNUMERICpara SparkDecimalType. Consulte Mapeamentos de tipos de dados para obter mais informações.
Execute o seguinte comando SQL em um notebook ou no editor Databricks SQL. Os itens entre colchetes são opcionais. Substitua os valores temporários.
<catalog-name>: Nome para o catálogo no Databricks.<connection-name>: O objeto de conexão que especifica a fonte de dados, o caminho e as credenciais de acesso.<data-project-id>: Um ID de projeto opcional do projeto BigQuery que contém os dados a serem mapeados para este catálogo. Caso não seja especificado, será utilizado o ID do projeto definido na conexão, seguido pelo ID do projeto da account do serviço.<dataset-name>: Um nome de conjunto de dados opcional do BigQuery a ser usado para materializar os resultados da consulta. Caso não seja especificado, um conjunto de dados de materialização é provisionado automaticamente quando necessário. Veja Materialização para mais informações.<force-materialization>: um valor Boolean opcional. Setrue, cada query no catálogo materializa seus resultados. O default éfalse. Consulte Materialização para obter mais informações.<scale>: Um valor de escala opcional [0,38] para mapear BigQueryBIGNUMERICpara SparkDecimalType(38, scale). O valor padrão é38. Consulte Mapeamentos de tipos de dados para obter mais informações.
CREATE FOREIGN CATALOG [IF NOT EXISTS] <catalog-name> USING CONNECTION <connection-name>
[OPTIONS (
dataProjectId '<data-project-id>',
materializationDataset '<dataset-name>',
forceMaterialization '<force-materialization>',
bigNumericDefaultScale '<scale>'
)];
Materialização
Ao contrário de outros conectores de federação, o conector do BigQuery usa a API BigQuery Storage em vez de JDBC para desempenho aprimorado. O Databricks pode ler do BigQuery diretamente do armazenamento ou usando um dataset materializado. Leituras diretas oferecem melhor desempenho para grandes varreduras e suportam pushdowns de filtro e projeção. A materialização envia operações adicionais (limite, agregações, joins, classificação) para o compute do BigQuery antes de transmitir os resultados para o Databricks.
As visualizações e tabelas externas são sempre materializadas. Todas as outras leituras usam armazenamento direto sem materialização por default.
Considere habilitar a materialização se precisar de pushdowns avançados, estiver lendo conjuntos de resultados pequenos de conjuntos de dados grandes ou estiver lendo dados entre regiões diferentes. A materialização acarreta custos adicionais de compute do BigQuery.
Para forçar a materialização de cada query em um catálogo externo, selecione Force materialization no Explorador de Catálogos ou defina a opção de catálogo forceMaterialization como true. Você não precisa atualizar query individuais.
A opção de catálogo forceMaterialization é compatível com o compute necessário, exceto que os clusters devem executar o Databricks Runtime 16.4 LTS ou acima.
Para habilitar a materialização para uma única query, defina a opção materializationEnabled como true após o nome da tabela do BigQuery:
SELECT * FROM <catalog-name>.<schema-name>.<table-name>
WITH ('materializationEnabled' 'true');
Por default, um conjunto de dados de materialização é provisionado automaticamente quando necessário. Você pode especificar um conjunto de dados personalizado usando a opção de catálogo materializationDataset ao criar ou alterar o catálogo estrangeiro. Isso é útil se a account de serviço não tiver permissões para criar conjuntos de dados ou se você quiser controlar onde as tabelas de materialização temporárias são armazenadas. Por exemplo:
CREATE FOREIGN CATALOG my_catalog USING CONNECTION my_bq_connection
OPTIONS (materializationDataset 'my_materialization_dataset');
Para atualizar um catálogo existente, execute:
ALTER CATALOG my_catalog OPTIONS (materializationDataset 'my_materialization_dataset');
Ler tabelas externas do BigQuery
Você pode consultar tabelas externas BigQuery , incluindo tabelas com suporte do BigLake e do armazenamento cloud , diretamente do seu fluxo de trabalho. Essas tabelas são materializadas automaticamente antes da execução da consulta, permitindo acesso total ao seu conteúdo sem configuração adicional.
Tabelas externas suportadas
O BigLake e tabelas externas de armazenamento cloud são compatíveis.
- As tabelas BigLake fazem referência a dados armazenados no armazenamento cloud e incluem gerenciamento de controle de acesso granular por meio BigQuery.
- As tabelas externas do armazenamento em nuvem fazem referência a arquivos diretamente usando URIs.
Ao consultar essas tabelas, o sistema materializa os dados para que a execução da sua consulta seja feita no armazenamento integrado BigQuery , oferecendo suporte completo a recursos SQL e desempenho ideal.
Para obter mais informações, consulte a documentação BigQuery para tabelas BigLake e tabelas externas do Cloud Storage.
Pushdowns suportados
O suporte ao pushdown depende de a materialização estar ativada ou não. Algumas operações são enviadas automaticamente para BigQuery compute , enquanto outras requerem materialização.
Os seguintes pushdowns são suportados sem materialização:
- Filtros, aplicados como restrições de linha da API do BigQuery Storage (somente predicados simples — comparações coluna-para-literal,
IN,IS NULL,LIKEe combinaçõesANDouORdesses). Filtros que fazem referência aos operadores ou funções listados abaixo exigem materialização. - Projeções
Os seguintes processamentos adicionais são suportados com a materialização ativada. Com a materialização, os filtros são compilados para SQL em vez de restrições de linha da API BigQuery Storage, para que possam conter adicionalmente os seguintes operadores e funções:
- Limite
- Offset, quando usado com limite
- Agregados
- Classificação, quando usada com limite
- join (Databricks Runtime 16.1 ou acima)
- Operadores de comparação, Boolean, bit a bit e aritméticos (operadores aritméticos só são processados quando o modo ANSI está ativado)
- Funções matemáticas (
ABS,FLOOR) — suporte parcial, somente expressões de filtro - Funções de strings (
CONCAT,UPPER,LOWER,LENGTH,TRIM,LTRIM,RTRIM) — suporte parcial, apenas expressões de filtro Contains,Startswith,Endswith- Funções de data, hora e timestamp (
DATE_TRUNCeEXTRACTpara ano, trimestre, mês, dia, hora e minuto) — suporte parcial, apenas expressões de filtro - Funções diversas (
COALESCE,Cast,CASE WHEN,IF, e acesso a elementos de array) — suporte parcial, apenas expressões de filtro
Os seguintes pushdowns não são suportados:
- Funções da janela
Mapeamentos de tipos de dados
A tabela a seguir mostra o mapeamento do tipo de dados do BigQuery para o Spark.
Tipo de BigQuery | Spark tipo |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Qualquer tipo com modo |
|
* O BigQuery BIGNUMERIC tem uma precisão de até 76 dígitos, o que excede a precisão máxima do Spark DecimalType de 38. Por default, BIGNUMERIC corresponde a DecimalType(38, 38). Para configurar a escala, use a opção de catálogo bigNumericDefaultScale . Os valores permitidos são [0, 38]. Por exemplo, bigNumericDefaultScale = '10' mapeia BIGNUMERIC para DecimalType(38, 10). BigQuery NUMERIC mapeia para sua precisão e escala declaradas.
O conector começou a usar a API BigQuery Storage no Databricks Runtime 16.4. Do Databricks Runtime 16.4 a 17.x, a API Storage mapeava o BigQuery DATETIME para o Spark StringType em vez de TimestampNTZType. O Databricks Runtime 18.0 restaura o mapeamento TimestampNTZType.
No BigQuery, uma coluna com o modo REPEATED é mapeada para um ArrayType do Spark contendo o tipo Spark correspondente. Por exemplo, uma coluna REPEATED STRING do BigQuery é mapeada para ArrayType(VarcharType), e uma coluna REPEATED INT64 do BigQuery é mapeada para ArrayType(LongType).
Quando o senhor lê em BigQuery, BigQuery Timestamp é mapeado para Spark TimestampType se preferTimestampNTZ = false (default). BigQuery Timestamp é mapeado para TimestampNTZType se preferTimestampNTZ = true.
Colunas INTERVAL do BigQuery não são suportadas no momento. Uma tabela estrangeira que contém uma coluna INTERVAL falha quando seu esquema é carregado, portanto, você não pode descrever, query ou ingerir a tabela. Tabelas sem uma coluna INTERVAL não são afetadas.
Solução de problemas
A seção a seguir descreve um erro comum e sua solução ao usar o conector BigQuery.
Error creating destination table using the following query [<query>]
Causa comum: a account de serviço usada pela conexão não tem a função de usuárioBigQuery .
Resolução:
- Conceda a função de usuárioBigQuery à account serviço usada pela conexão. Esta função é necessária para criar o dataset de materialização que armazena temporariamente os resultados da consulta.
- Reexecução da consulta.