9
votes

Éliminer les enregistrements en double dans une table de bigquery

Je prévois d'ajouter des données incrémentielles quotidiennement à une table de bigquery. Chaque fois que j'ajoute des données incrémentielles à la table existante, je souhaite éliminer les enregistrements en double (basé sur une colonne de clé principale) des données existantes dans le tableau. Une approche serait à -

  1. Collectez l'ensemble des touches des données incrémentielles (appelons-le incrontous )
  2. Exécutez une requête sur les lignes de - Sélectionnez All_Cols à partir de la table où pKKEY_COL n'est pas dans (incrontys) - et stocke les résultats dans une nouvelle table.
  3. appendez les données incrémentielles à la nouvelle table.

    Mon préoccupation avec cette approche est qu'il crée une copie en double d'une grande table et ajoute à mes factures.

    Y a-t-il un meilleur moyen d'atteindre la même chose sans créer une table en double?


7 commentaires

Quelle est la taille de la table? Si plus de 64 Mo comprimé, # 2 échouera.


@RyanBoyd - Cela ne devrait pas être un problème. Si INCL_KEYS> 64MB, je pourrais diviser incrompt_keys en petits morceaux et répéter <2>


Le problème est que si la table complète (c.-à-d. Les données non intresques) sont> 64 Mo. La requête SELECT IN # 2 ne réussira pas.


@RYANBOYDD - HMM, vérifié à nouveau le Guide des développeurs. Doivent trouver une approche alternative alors. Merci d'avoir fait remarquer cela!


Êtes votre question R. Je suis d'accord surtout que nous avons besoin de meilleurs canaux pour que vous posiez ce type de question. Nous essayons de comprendre la meilleure façon pour vous de le faire, tout en veillant à ce que toutes les questions techniques / développeurs apparaissent. En attendant, n'hésitez pas à tendre la main via profiles.google.com/ryan.boyd sur Google+ et Ryguyrg sur Twitter.


Comment avez-vous fini par résoudre ce problème?


Je suce à Stackoverflow, je ne suis donc pas sûr de la meilleure façon de relier ces questions connexes, mais voici notre recommandation actuelle (BigQuery) sur la manière de faire cela: Stackoverflow.com / Questions / 34165094 / ...


3 Réponses :


5
votes

Je ne savais pas d'une façon de le faire sans créer de table en double - cela semble réellement comme une solution assez intelligente.

Le coût progressif pour vous, cependant, sera probablement très petit - BigQuery ne vous facture que pour les données pour la durée de la durée de laquelle il existe. Si vous supprimez l'ancienne table, vous devez seulement payer pour les deux tables pendant une période de secondes ou minutes.


1 commentaires

Merci @jordan, je peux vivre avec ça! Serait toujours génial si quelqu'un pourrait suggérer une solution sans impliquer des tables en double.



1
votes

Vous pouvez exécuter la requête avec la table de destination définie sur la table existante et définir la disposition d'écriture à tronquer:

bq cp mydataset.mytable mydataset.backup
# You can also build the new table in one pass:
bq query --allow_large_results --replace --destination_table=mydataset.mytable \
    'SELECT * FROM (
         SELECT * FROM mydataset.mytable
         WHERE key NOT IN (SELECT key FROM mydataset.update)
     ), (
         SELECT * FROM mydataset.update
     )'
bq rm mydataset.backup


1 commentaires

Comment cela fonctionnerait-il exactement et comment remplissez-vous MyDataSet.Update?



0
votes

Vous pouvez définir une nouvelle table de destination et interroger simplement un compte et un groupe par toutes les colonnes:

SELECT
  FIELD1,
  FIELD2,
  FIELD3,
  FIELD4
FROM (
  SELECT
    COUNT (*),
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4
  FROM
    [<TABLE>]
  GROUP BY
    FIELD1,
    FIELD2,
    FIELD3,
    FIELD4)


0 commentaires