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.
Antes de começar
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:
- Conectividade de rede do seu recurso de compute para os sistemas de banco de dados de destino. Consulte Recomendações de rede para a Lakehouse Federation.
- 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.
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 da URL no JSON da conta de serviço, e eles podem variar por account. Use-os exatamente como aparecem em seu arquivo JSON baixado. 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.
-
(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 do espaço reservado.
<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.
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.