Usar junções de stream para stream em consultas contínuas

No BigQuery, é possível usar mesclagens de stream para stream em consultas contínuas para analisar e correlacionar dados de dois ou mais streams de dados em tempo real. As mesclagens de stream para stream são uma operação de mesclagem entre duas ou mais tabelas que recebem ingestão de dados orientada por tempo.

Os casos de uso comuns para mesclagens de stream para stream incluem detecção de fraudes financeiras, criação de perfis de clientes e otimização do gerenciamento da cadeia de suprimentos. Essas junções são um tipo importante de operação com estado. Para mais informações sobre operações com estado, consulte Operações com estado compatíveis.

Tipos de JOIN compatíveis

Os seguintes tipos de JOIN são compatíveis com consultas contínuas:

  • JOIN de stream para stream: uma operação de mesclagem entre duas ou mais tabelas que recebem ingestão de dados orientada por tempo.
  • INNER JOIN.

Tipos de JOIN não aceitos

Os seguintes tipos de JOIN não são compatíveis com consultas contínuas:

  • JOINs de stream para tabela estática: uma mesclagem em que pelo menos uma tabela mesclada é uma tabela estática que não recebe ingestão de dados orientada por tempo. Um exemplo de tabela estática é uma tabela de dimensões.
  • Outras formas de operações JOIN além de INNER.
  • JOINs que não têm cláusulas JOIN orientadas por tempo.

Unir dados de vários streams

A consulta a seguir mostra como mesclar uma tabela de corridas de táxi com uma tabela de solicitações de táxi, identificar o táxi disponível mais próximo do solicitante em um período de 5 minutos e exportar esses dados para outra tabela do BigQuery:

INSERT INTO
 `real_time_taxi_streaming.matched_rides`
SELECT
 requests.timestamp AS request_time,
 requests.request_id,
 taxis.taxi_id,
 ST_DISTANCE(
   ST_GEOGPOINT(requests.longitude, requests.latitude),
   ST_GEOGPOINT(taxis.longitude, taxis.latitude)
   ) AS distance_in_meters,
 taxis.timestamp AS taxi_available_time
FROM
 APPENDS (TABLE `real_time_taxi_streaming.ride_requests`,
   CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS requests
INNER JOIN
 APPENDS (TABLE `real_time_taxi_streaming.taxirides`,
   CURRENT_TIMESTAMP() - INTERVAL 10 MINUTE) AS taxis
ON
 requests.geohash = taxis.geohash
WHERE
 taxis.ride_status = 'available'
 AND taxis._CHANGE_TIMESTAMP BETWEEN(requests._CHANGE_TIMESTAMP - INTERVAL 5 MINUTE) AND requests._CHANGE_TIMESTAMP
 AND ST_DWITHIN(
   ST_GEOGPOINT(requests.longitude, requests.latitude),
   ST_GEOGPOINT(taxis.longitude, taxis.latitude),
   2000 -- Distance in meters
   );

Considerações sobre mesclagem

As seções a seguir descrevem as considerações necessárias ao realizar uma mesclagem de stream para stream.

Limitações

  • Somente as operações INNER JOIN são compatíveis. Outras formas, como LEFT ou FULL OUTER, não são compatíveis.
  • Cada lado da operação INNER JOIN precisa especificar um horário de início para a consulta contínua.
  • Além de uma chave de mesclagem (por exemplo, table1.user_id = table2.user_id), a cláusula JOIN precisa incluir uma condição para restringir a coluna de carimbo de data/hora a um intervalo constante. Essa condição limita o tempo que o sistema espera para que um evento correspondente chegue no outro stream. Por exemplo, é possível especificar que um evento de um stream só pode ser mesclado com um evento de outro se os carimbos de data/hora estiverem em um intervalo de 5 minutos. Você não se limita a intervalos simétricos. Por exemplo, é possível usar um intervalo de 5 minutos em um lado da condição de mesclagem e um intervalo de 1 hora no outro.
  • Ao iniciar uma consulta contínua com uma mesclagem de stream para stream, apenas a função APPENDS é aceita. A função CHANGES não é compatível.
  • A coluna de horário do sistema do BigQuery, definida por _CHANGE_TIMESTAMP, é a única coluna de carimbo de data/hora compatível com operações de mesclagem. Não é possível usar colunas definidas pelo usuário.
  • Quando usado em conjunto com agregações em janela, é necessário seguir todas as limitações documentadas de agregação em janela.

Considerações de preço

As consultas contínuas do BigQuery são faturadas com base na capacidade de computação (slots) consumida enquanto o job está em execução. Esse modelo baseado em computação também se aplica a operações com estado, como mesclagens. Como as mesclagens exigem que o sistema armazene o "estado" enquanto a consulta está ativa, elas consomem mais recursos de slot. Mais contexto ou dados armazenados em uma mesclagem, por exemplo, quando você usa intervalos de tempo mais longos na cláusula JOIN ou WHERE, exigem a preservação de mais estado, o que leva a uma maior utilização de slots.

A seguir