Utiliser des jointures flux à flux dans les requêtes continues

Dans BigQuery, vous pouvez utiliser des jointures flux à flux dans des requêtes continues pour analyser et mettre en corrélation des données provenant de plusieurs flux de données en temps réel. Les jointures de flux à flux sont une opération de jointure entre deux tables ou plus qui reçoivent une ingestion de données temporelles.

Les cas d'utilisation courants des jointures flux à flux incluent la détection des fraudes financières, la création de profils client et l'optimisation de la gestion de la chaîne d'approvisionnement. Ces jointures sont un type d'opération avec état essentiel. Pour en savoir plus sur les opérations avec état, consultez Opérations avec état compatibles.

Types JOIN compatibles

Les types JOIN suivants sont acceptés par les requêtes continues :

  • Jointure flux à flux : opération de jointure entre deux tables ou plus qui reçoivent une ingestion de données temporelles.
  • INNER JOIN.

Types JOIN non compatibles

Les types de JOIN suivants ne sont pas compatibles avec les requêtes continues :

  • Jointures de flux vers une table statique : jointure dans laquelle au moins une table jointe est une table statique qui ne reçoit pas d'ingestion de données temporelles. Une table de dimension est un exemple de table statique.
  • Autres formes d'opérations JOIN que INNER.
  • Les JOIN qui n'ont pas de clauses JOIN temporelles.

Associer des données provenant de plusieurs flux

La requête suivante montre comment joindre une table de trajets en taxi à une table de demandes de taxi, identifier le taxi disponible le plus proche du demandeur dans un intervalle de cinq minutes, puis exporter ces données dans une autre table 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
   );

Points à prendre en compte pour les jointures

Les sections suivantes décrivent les points à prendre en compte lors d'une jointure de flux à flux.

Limites

  • Seules les opérations INNER JOIN sont acceptées. Les autres formes, telles que LEFT ou FULL OUTER, ne sont pas acceptées.
  • Chaque côté de l'opération INNER JOIN doit spécifier une heure de début pour la requête continue.
  • En plus d'une clé de jointure (par exemple, table1.user_id = table2.user_id), la clause JOIN doit inclure une condition pour limiter la colonne de code temporel à un intervalle constant. Cette condition limite le temps d'attente du système avant qu'un événement correspondant n'arrive dans l'autre flux. Par exemple, vous pouvez spécifier qu'un événement d'un flux ne peut être joint à un événement d'un autre flux que si leurs codes temporels se trouvent dans un intervalle de cinq minutes. Vous n'êtes pas limité à des intervalles symétriques. Par exemple, vous pouvez utiliser un intervalle de 5 minutes d'un côté de la condition de jointure et un intervalle d'une heure de l'autre.
  • Lorsque vous démarrez une requête continue avec une jointure flux à flux, seule la fonction APPENDS est acceptée. La fonction CHANGES n'est pas prise en charge.
  • La colonne d'heure système BigQuery, définie par _CHANGE_TIMESTAMP, est la seule colonne d'horodatage compatible avec les opérations de jointure. Les colonnes définies par l'utilisateur ne sont pas acceptées.
  • Lorsqu'elles sont utilisées conjointement avec des agrégations fenêtrées, vous devez respecter toutes les limites d'agrégation fenêtrée documentées.

Remarques sur les tarifs

Les requêtes continues BigQuery sont facturées en fonction de la capacité de calcul (emplacements) consommée pendant l'exécution du job. Ce modèle basé sur le calcul s'applique également aux opérations avec état, comme les jointures. Étant donné que les jointures nécessitent que le système stocke l'état pendant que la requête est active, elles consomment des ressources d'emplacements supplémentaires. Plus le contexte ou les données stockés dans une jointure sont importants (par exemple, lorsque vous utilisez des intervalles de temps plus longs dans la clause JOIN ou WHERE), plus l'état doit être préservé, ce qui entraîne une utilisation plus élevée des emplacements.

Étapes suivantes