Exporte dados para o Bigtable (ETL inverso)
Este documento descreve como pode configurar o ETL inverso (RETL) do BigQuery para o Bigtable. Pode fazê-lo através da declaração EXPORT
DATA
para
exportar dados de uma tabela do BigQuery para uma tabela do
Bigtable.
Pode usar um fluxo de trabalho RETL para o Bigtable para combinar as capacidades de estatísticas do BigQuery com a baixa latência e o elevado débito do Bigtable. Este fluxo de trabalho permite-lhe publicar dados para utilizadores da aplicação sem esgotar as quotas e os limites no BigQuery.
Caraterísticas das tabelas do Bigtable
As tabelas do Bigtable diferem das tabelas do BigQuery de várias formas:
- As tabelas do Bigtable e do BigQuery são compostas por linhas, mas uma linha do Bigtable é composta por uma chave de linha e famílias de colunas que têm um número arbitrário de colunas pertencentes à mesma família de colunas.
- As famílias de colunas de uma determinada tabela são criadas no momento da criação da tabela, mas também podem ser adicionadas ou removidas posteriormente. Quando é criada uma família de colunas, não é necessário especificar as colunas que lhe pertencem.
- Não é necessário definir as colunas do Bigtable antecipadamente, e estas podem ser usadas para armazenar dados no respetivo nome (também conhecido como qualificador) dentro dos limites de tamanho dos dados nas tabelas.
- As colunas do Bigtable podem ter qualquer valor binário dentro dos limites de tamanho dos dados nas tabelas.
- As colunas do Bigtable têm sempre uma dimensão temporal (também conhecida como versão). Pode armazenar qualquer número de valores em qualquer linha para a mesma coluna, desde que a data/hora não seja idêntica.
- Uma data/hora do Bigtable é medida em microssegundos desde a hora de época Unix. Por exemplo, 0 representa 1970-01-01T00:00:00 UTC. As indicações de tempo têm de ser um número não negativo de microssegundos com granularidade de milissegundos (apenas são aceites múltiplos de 1000 us). A data/hora predefinida do Bigtable é 0.
- Os dados no Bigtable são lidos por chave de linha, várias chaves de linha, intervalo de chaves de linha ou através de um filtro. É necessária, pelo menos, uma chave de linha ou um intervalo de chaves de linhas em todos os tipos de pedidos de leitura, exceto numa análise completa da tabela.
Para obter informações sobre como preparar os resultados do BigQuery para exportação para o Bigtable, consulte o artigo Prepare os resultados da consulta para exportação.
Antes de começar
Tem de criar uma instância do Bigtable e uma tabela do Bigtable para receber os dados exportados.
Conceda funções de gestão de identidade e de acesso (IAM) que dão aos utilizadores as autorizações necessárias para realizar cada tarefa neste documento.
Funções necessárias
Para receber as autorizações de que precisa para exportar dados do BigQuery para o Bigtable, peça ao seu administrador que lhe conceda as seguintes funções do IAM no seu projeto:
-
Exporte dados de uma tabela do BigQuery:
Visualizador de dados do BigQuery (
roles/bigquery.dataViewer
) -
Execute uma tarefa de exportação:
Utilizador do BigQuery (
roles/bigquery.user
) -
Escrever dados numa tabela do Bigtable:
Utilizador do Bigtable (
roles/bigtable.user
) -
Criar automaticamente novas famílias de colunas para uma tabela do Bigtable:
Administrador do Bigtable (
roles/bigtable.admin
)
Para mais informações sobre a atribuição de funções, consulte o artigo Faça a gestão do acesso a projetos, pastas e organizações.
Também pode conseguir as autorizações necessárias através de funções personalizadas ou outras funções predefinidas.
Limitações
- A codificação está limitada apenas a
BINARY
eTEXT
. - O perfil da app do Bigtable de destino tem de ser configurado com encaminhamento de cluster único e um nível de prioridade de pedido baixo.
- O perfil da app do Bigtable tem de ser configurado para encaminhar dados para um cluster do Bigtable localizado juntamente com o conjunto de dados do BigQuery. Para mais informações, consulte as considerações de localização.
- As exportações para o Bigtable só são suportadas para as edições Enterprise ou Enterprise Plus do BigQuery. A edição Standard do BigQuery e a computação a pedido não são suportadas.
- As exportações para o Bigtable só são suportadas para reservas com uma atribuição
QUERY
.
Considerações sobre a localização
- Se o seu conjunto de dados do BigQuery estiver numa região múltipla, o
perfil da app do Bigtable
tem de ser configurado para encaminhar dados para um cluster do Bigtable nessa região múltipla.
Por exemplo, se o seu conjunto de dados do BigQuery estiver na
US
multirregião, o cluster do Bigtable pode estar localizado na regiãous-west1
(Oregão), que se encontra nos Estados Unidos. - Se o seu conjunto de dados do BigQuery estiver numa única região, o perfil da app do Bigtable
tem de ser configurado para encaminhar dados para um cluster do Bigtable na
mesma região. Por exemplo, se o seu conjunto de dados do BigQuery estiver na região
asia-northeast1
(Tóquio), o cluster do Bigtable também tem de estar na regiãoasia-northeast1
(Tóquio).
Para mais informações, consulte o artigo Localizações do Bigtable.
Tipos do BigQuery suportados
Os seguintes tipos de dados são suportados quando são escritos no Bigtable:
Tipo do BigQuery | Valor do Bigtable escrito |
---|---|
BYTES |
Exportado tal como está. |
STRING |
Convertido em BYTES . |
INTEGER |
Se bigtable_options.column_families.encoding estiver definido como
BINARY , o valor é escrito num formato de 8 bytes, big-endian
(byte mais significativo
primeiro). Se bigtable_options.column_families.encoding estiver definido como TEXT , o valor é escrito como uma string legível que representa um número. |
FLOAT |
Escreve o valor no formato de saída de 8 bytes IEEE 754. |
BOOLEAN |
Se bigtable_options.column_families.encoding estiver definido como BINARY , o valor é escrito como um valor de 1 byte (false = 0x00 ou true = 0x01). Se bigtable_options.column_families.encoding estiver definido como TEXT , o valor é escrito como texto ("true" ou "false" ). |
JSON |
Uma coluna exportada do tipo
JSON é interpretada como um grupo de colunas pertencentes a uma família de colunas do Bigtable específica. Os membros do objeto JSON são interpretados como colunas e os respetivos valores são escritos no Bigtable. O nome da coluna a escrever pode ser ajustado através da configuração bigtable_options . Por exemplo:
JSON '{"FIELD1": "VALUE1", "FIELD2": "VALUE2"}' as MY_COLUMN_FAMILY Em que os valores VALUE1 e VALUE2 são escritos no Bigtable como colunas FIELD1 e FIELD2 para a família de colunas MY_COLUMN_FAMILY.
|
STRUCT |
Uma coluna exportada do tipo
STRUCT é interpretada como um grupo de colunas pertencentes a uma família de colunas do Bigtable específica. Os membros da struct são interpretados como colunas e os respetivos valores a serem escritos no Bigtable. O nome da coluna a escrever pode ser ajustado através da configuração bigtable_options . Por exemplo:
STRUCT<FIELD1 STRING, FIELD2 INTEGER> as MY_COLUMN_FAMILY Em que os valores FIELD1 e FIELD2 são escritos no Bigtable como colunas FIELD1 e FIELD2 para a família de colunas MY_COLUMN_FAMILY.
|
Estes tipos de dados suportados são semelhantes à leitura de tabelas externas do Bigtable para o BigQuery.
Valores NULL
no Bigtable
Os valores NULL
no Bigtable têm as seguintes restrições:
O Bigtable não tem nenhum análogo para os valores
NULL
. A exportação de umNULL
valor para uma determinada família de colunas e coluna no Bigtable elimina os valores presentes de uma linha do Bigtable.Se um valor do Bigtable com uma determinada chave de linha, família de colunas, qualificador de coluna e data/hora não existir antes da exportação, os valores
NULL
exportados não têm efeito na linha do Bigtable.Quando exporta um valor
NULL
do tipoSTRUCT
ouJSON
, todos os valores das colunas pertencentes à família de colunas correspondente da linha afetada são eliminados. Deve converter o valorNULL
para o tipoSTRUCT
ouJSON
para que o motor SQL anexe um tipo correto ao mesmo. A consulta seguinte elimina todos os dados da família de colunascolumn_family1
com um conjunto de chaves de linhas fornecidas:EXPORT DATA OPTIONS (...) AS SELECT rowkey, CAST(NULL as STRUCT<INT64>) AS column_family1 FROM T
As linhas com chaves de linhas
NULL
são ignoradas durante a exportação. O número de linhas ignoradas é devolvido nas estatísticas de exportação ao autor da chamada.
Configure as exportações com o bigtable_options
Pode usar a configuração bigtable_options
durante uma exportação para colmatar as diferenças entre os modelos de armazenamento do BigQuery e do Bigtable. A configuração é expressa sob a forma de uma string JSON, como se vê no exemplo seguinte:
EXPORT DATA OPTIONS( uri="https://bigtable.googleapis.com/projects/PROJECT_ID
/instances/INSTANCE_ID
/appProfiles/APP_PROFILE_ID
/tables/TABLE
", bigtable_options = """{ "columnFamilies": [{ "familyId": "COLUMN_FAMILY_NAME
", "encoding": "ENCODING_VALUE
", "columns": [ { "qualifierString": "BIGTABLE_COLUMN_QUALIFIER
", ["qualifierEncoded": "BASE_64_ENCODED_VALUE
",] "fieldName": "BIGQUERY_RESULT_FIELD_NAME
" } ] }] }""" )
A tabela seguinte descreve os campos possíveis usados numa bigtable_options
configuração:
Nome do campo | Descrição |
---|---|
columnFamilies |
Uma matriz de descritores de famílias de colunas. |
columnFamilies.familyId |
Identificador da família de colunas do Bigtable. |
columnFamilies.encoding |
O valor pode ser definido como BINARY ou TEXT . Para obter informações sobre como os tipos são codificados, consulte o artigo Tipos do BigQuery suportados. |
columnFamilies.columns |
Uma matriz de mapeamentos de colunas do Bigtable. |
columnFamilies.columns.qualifierString |
Opcional: um qualificador de coluna do Bigtable. Especifique este valor se o qualificador de coluna não tiver códigos não UTF-8. Os campos qualifierString e qualifierEncoding são mutuamente exclusivos. Se não especificar qualifierString nem qualifierEncoded , é usado fieldName como qualificador de coluna. |
columnFamilies.columns.qualifierEncoded |
Opcional: qualificador de coluna codificado em Base64. Semelhante a qualifierString , caso o qualificador de coluna tenha de ter códigos não UTF-8. |
columnFamilies.columns.fieldName |
Obrigatório: nome do campo do conjunto de resultados do BigQuery. Pode ser uma string vazia em determinados casos. Para ver um exemplo de como um valor fieldName vazio é usado com campos de tipos simples, consulte o artigo Prepare os resultados da consulta para exportação. |
Prepare os resultados da consulta para exportação
Para exportar os resultados da consulta para o Bigtable, os resultados têm de cumprir os seguintes requisitos:
- O conjunto de resultados tem de conter uma coluna
rowkey
do tipoSTRING
ouBYTES
. - As chaves de linhas, os qualificadores de colunas, os valores e as datas/horas não podem exceder os limites de tamanho dos dados do Bigtable nas tabelas.
- Tem de estar presente, pelo menos, uma coluna que não seja
rowkey
no conjunto de resultados. - Cada coluna do conjunto de resultados tem de ser de um dos tipos do BigQuery suportados. Todos os tipos de colunas não suportados têm de ser convertidos num dos tipos suportados antes da exportação para o Bigtable.
O Bigtable não exige que os qualificadores de colunas sejam nomes de colunas do BigQuery válidos e suporta a utilização de quaisquer bytes. Para obter informações sobre a substituição dos qualificadores de colunas de destino para uma exportação, consulte o artigo Configure exportações com bigtable_options
.
Se usar valores exportados com APIs Bigtable, como ReadModifyWriteRow
, todos os valores numéricos têm de usar a codificação binária correta.
Por predefinição, as colunas de resultados autónomas de tipos diferentes de STRUCT
ou JSON
são interpretadas como valores para famílias de colunas de destino iguais ao nome da coluna de resultados e o qualificador de coluna igual a uma string vazia.
Para demonstrar como estes tipos de dados são escritos, considere o seguinte exemplo de SQL,
em que column
e column2
são colunas de resultados autónomas:
SELECT
x as column1, y as column2
FROM table
Nesta consulta de exemplo, SELECT x as column1
escreve valores no Bigtable na família de colunas column1
e no qualificador de coluna ''
(string vazia) quando processa tipos diferentes de JSON
ou STRUCT
.
Pode alterar a forma como estes tipos são escritos numa exportação através da configuração bigtable_options
, como
mostrado no exemplo seguinte:
EXPORT DATA OPTIONS ( … bigtable_options="""{ "columnFamilies" : [ { "familyId": "ordered_at", "columns": [ {"qualifierString": "order_time", "fieldName": ""} ] } ] }""" ) AS SELECT order_id as rowkey, STRUCT(product, amount) AS sales_info, EXTRACT (MILLISECOND FROM order_timestamp AT TIME ZONE "UTC") AS ordered_at FROM T
Neste exemplo, a tabela do BigQuery T
contém a seguinte linha:
order_id |
order_timestamp |
product |
amount |
---|---|---|---|
101 | 2023-03-28T10:40:54Z | Joystick | 2 |
Se usar a configuração bigtable_options
anterior com a tabela T
, os seguintes dados são escritos no Bigtable:
rowkey |
sales_info (família de colunas) |
ordered_at (família de colunas) |
|||
---|---|---|---|---|---|
101 | produto | valor | order_time | ||
1970-01-01T00:00:00Z | Joystick | 1970-01-01T00:00:00Z | 2 | 1680000054000 |
1680000054000
representa 2023-03-28T10:40:54Z
em milissegundos desde a hora de época Unix no fuso horário UTC.
Crie automaticamente novas famílias de colunas
Para criar automaticamente novas famílias de colunas numa tabela do Bigtable,
defina a opção auto_create_column_families
na declaração EXPORT DATA
como true
. Esta opção requer a autorização bigtable.tables.update
, que está incluída em funções como a de administrador do Bigtable (roles/bigtable.admin
).
EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID
/tables/TABLE",
format="CLOUD_BIGTABLE",
auto_create_column_families = true
) AS
SELECT
order_id as rowkey,
STRUCT(product, amount) AS sales_info
FROM T
Defina a indicação de tempo para todas as células numa linha através de _CHANGE_TIMESTAMP
Pode adicionar uma coluna _CHANGE_TIMESTAMP
do tipo TIMESTAMP
ao resultado para exportação.
Cada célula escrita no Bigtable usa o valor do carimbo de data/hora da
_CHANGE_TIMESTAMP
da linha de resultado exportada.
O Bigtable não suporta datas/horas anteriores à época Unix (1970-01-01T00:00:00Z). Se o valor de _CHANGE_TIMESTAMP
for NULL
, a hora epoch Unix de 0
é usada como o valor de data/hora predefinido.
A consulta seguinte escreve células para as colunas product
e amount
com a data/hora especificada na coluna order_timestamp
da tabela T
.
EXPORT DATA OPTIONS (...) AS SELECT rowkey, STRUCT(product, amount) AS sales_info, order_timestamp as _CHANGE_TIMESTAMP FROM T
Exporte continuamente
Se quiser processar continuamente uma consulta de exportação, pode configurá-la como uma consulta contínua.
Exporte vários resultados com o mesmo valor de rowkey
Quando exporta um resultado que contém várias linhas com o mesmo valor rowkey
, os valores escritos no Bigtable acabam na mesma linha do Bigtable.
Pode usar este método para gerar várias versões de valores de colunas na mesma linha. Neste exemplo, a tabela orders
no BigQuery contém os seguintes dados:
id |
customer |
order_timestamp |
amount_spent |
---|---|---|---|
100 | João | 2023-01-01T10:10:54Z | 10,99 |
101 | Alice | 2023-01-02T12:10:50Z | 102,7 |
102 | João | 2023-01-04T15:17:01Z | 11.1 |
Em seguida, o utilizador executa a seguinte declaração EXPORT DATA
:
EXPORT DATA OPTIONS (
uri="https://bigtable.googleapis.com/projects/PROJECT-ID/instances/INSTANCE-ID/appProfiles/APP_PROFILE_ID
/tables/TABLE",
format="CLOUD_BIGTABLE"
) AS
SELECT customer as rowkey, STRUCT(amount_spent) as orders_column_family, order_timestamp as _CHANGE_TIMESTAMP
FROM orders
A utilização desta declaração com a tabela orders
do BigQuery
resulta nos seguintes dados escritos no Bigtable:
orders_column_family | ||
---|---|---|
Chave da linha | amount_spent | |
Alice | 2023-01-02T12:10:50Z | 102,7 |
João | 2023-01-01T10:10:54Z | 10,99 |
2023-01-04T15:17:01Z | 11.1 |
A exportação para o Bigtable une os novos valores à tabela, em vez de substituir linhas inteiras. Se já existirem valores no Bigtable para uma chave de linha, os novos valores podem substituir parcial ou totalmente os valores anteriores, consoante a família de colunas, os nomes das colunas e as datas/horas das células que estão a ser escritas.
Exporte várias colunas como valores de Protocol Buffer (Protobuf)
Os buffers de protocolo oferecem um mecanismo flexível e eficiente para serializar dados estruturados. A exportação como Protobuf pode ser benéfica tendo em conta a forma como os diferentes tipos são processados entre o BigQuery e o Bigtable. Pode usar funções definidas pelo utilizador (UDFs) do BigQuery para exportar dados como valores binários Protobuf para o Bigtable. Para mais informações, consulte o artigo Exporte dados como colunas Protobuf.
Otimização da exportação
Pode alterar a taxa de transferência à qual os registos são exportados do BigQuery para o Bigtable modificando o número de nós no cluster de destino do Bigtable. O débito (linhas escritas por segundo) é ajustado linearmente com o número de nós no cluster de destino. Por exemplo, se duplicar o número de nós no cluster de destino, o débito de exportação duplica aproximadamente.
Preços
Quando exporta dados numa consulta padrão, a faturação é feita com base nos
preços de extração de dados.
Quando exporta dados numa consulta contínua, a faturação é feita através dos
preços de computação de capacidade do BigQuery.
Para executar consultas contínuas, tem de ter uma reserva que use a edição Enterprise ou Enterprise Plus e uma atribuição de reserva que use o tipo de tarefa CONTINUOUS
.
Após a exportação dos dados, é-lhe cobrado o armazenamento dos dados no Bigtable. Para mais informações, consulte os preços do Bigtable.