web-dev-qa-db-fra.com

Google BigQuery Il n'y a pas de clé primaire ou de contraintes uniques, comment empêcher l'insertion d'enregistrements en double?

Google BigQuery n'a pas de clé primaire ni de contraintes uniques.

Nous ne pouvons pas utiliser les options SQL traditionnelles telles que insert ignore ou insert on duplicate key update alors comment éviter que des enregistrements en double soient insérés dans Google BigQuery?

Si je dois d'abord appeler delete (en fonction d'une clé unique dans mon propre système) puis insérer pour éviter que des enregistrements en double ne soient insérés dans bigquery, cela ne serait-il pas trop inefficace? Je suppose que l'insertion est l'opération la moins chère, pas de requête, il suffit d'ajouter des données. Pour chaque encart, si je dois appeler supprimer, ce sera trop inefficace et nous coûtera de l'argent supplémentaire.

Quels sont vos conseils et suggestions en fonction de votre expérience?

Ce serait bien que bigquery ait la clé primaire, mais cela pourrait être en conflit avec la structure des algorithmes/données sur laquelle est basé bigquery?

12
searain

Alors clarifions certains faits en premier lieu.

Bigquery est un entrepôt de données géré adapté aux grands ensembles de données, et il est complémentaire à une base de données traditionnelle, plutôt qu'un remplacement.

Vous ne pouvez effectuer qu'un maximum de 96 opérations DML (mise à jour, suppression) sur une table par jour. C'est par conception. Cette limite est faible car elle vous oblige à considérer BQ comme un lac de données. Ainsi, sur BigQuery, vous laissez réellement toutes les données et tout est ajouté uniquement par conception. Cela signifie que par conception, vous disposez d'une base de données qui contient une nouvelle ligne pour chaque mise à jour. Par conséquent, si vous souhaitez utiliser les dernières données, vous devez sélectionner la dernière ligne et l'utiliser.

Nous tirons réellement parti des informations de chaque nouvelle mise à jour que nous ajoutons à la même ligne. Par exemple, nous pouvons détecter le temps qu'il a fallu à l'utilisateur final pour choisir son pays lors de l'inscription. Parce que nous avons une liste déroulante de pays, il a fallu un certain temps pour qu'il/elle défile vers le bon pays, et les mesures le montrent, car nous nous sommes retrouvés dans BQ avec deux lignes, un pays précédent sélectionné et un après pays sélectionné et basé sur sélection du temps nous avons pu optimiser le processus. Maintenant, dans notre liste déroulante de pays, nous avons les 5 premiers pays les plus récents/fréquents répertoriés, de sorte que ces utilisateurs n'ont plus besoin de faire défiler et de choisir un pays; c'est plus rapide.

11
Pentium10

"Supprimer et insérer en bloc" est l'approche que j'utilise pour éviter les enregistrements en double. Et les propres "Youtube BigQuery Transfer Services" de Google utilisent également "Bulk Delete and Insert".

"Youtube BigQuery Transfer Services" Poussez tous les jours les rapports quotidiens vers le même ensemble de tableaux de rapports. Chaque enregistrement a une colonne "date".

Lorsque nous exécutons le remblayage Youtube Bigquery Transfer (demandez à youtube bigquery transfer de pousser à nouveau les rapports pour certaines dates.) Les services Youtube BigQury Transfer vont d'abord supprimer le jeu de données complet pour cette date dans les tableaux de rapport, puis réinsérer le jeu de données complet de cette date. dans les tableaux de rapport.

Une autre approche consiste à supprimer d'abord le tableau des résultats (s'il existe déjà), puis à recréer le tableau des résultats et à ressaisir les résultats dans les tableaux. J'ai beaucoup utilisé cette approche. Chaque jour, mes résultats de données de processus sont enregistrés dans certains tableaux de résultats de l'ensemble de données quotidien. Si je relance le processus pour cette journée, mon script vérifiera si les tableaux de résultats pour cette journée existent ou non. Si la table existe pour ce jour, supprimez-la, puis recréez une nouvelle table, puis réintroduisez les résultats du processus dans la nouvelle table créée.

2
searain