0
votes

Mise à jour / insertion de BigQuery dans des tableaux et des tableaux de structures imbriquées

Modification de la question pour avoir une meilleure vue. P>

Il y a 2 tables - mise en scène et noyau. p>

J'ai du mal à copier les données de la mise en scène vers le noyau. p>

Conditions P>

  1. si id code>, année code> et local_id code> correspondant dans la mise en scène et le noyau -> les données code> pour ce spécifique La rangée de tableau doit être mise à jour de la mise en scène vers le noyau li>
  2. Si ID code> ne correspond pas à la mise en scène et à la noyau -> Une nouvelle ligne doit être insérée dans le noyau avec des valeurs de la stadification li>
  3. Si ID code> correspond à des correspondances mais de local_id code> / Année code> ne correspondez pas, une nouvelle ligne doit être insérée dans les données Code> Array. Li> ol>

    schéma de bigquery pour la mise en scène p> xxx pré>

    schéma de bigquery pour le noyau p> xxx pré>

    Contenu de grande requête pour la mise en scène - p> xxx pré>

    exemple de structure de contenu Entrez la description de l'image ici p>

    Contenu de grande requête pour le noyau - P>

    {"id":"1","content":"content1","createdAt":"2020-07-23 12:46:15.054410 UTC","data":[{"local_id":"123","year":2018,"country":"SE"},{"local_id":"33","year":2019,"country":"PL"},{"local_id":"123","year":2020,"country":"SE"}]}
    


2 commentaires

Voyons si je comprends bien: votre premier code insère dans votre table de destination tous les identifiants de la table source qui n'existe pas encore dans la destination. Dans le deuxième code, vous remplacez le champ de données de votre table de destination avec le champ de données de votre tableau source en fonction du champ ID?


@RMestevès Oui, c'est comme ça que ça a fonctionné pour moi. Ce pourrait être une façon brute de le faire.


3 Réponses :


0
votes
  1. Pour créer un champ de tableau, utilisez la fonction de tableau ().
  2. Pour ajouter à un champ de tableau, utilisez la fonction Array_ConCat ().

    Cette requête peut être utilisée pour faire "Mise à jour si présent" exigence: xxx

    https://cloud.google.com/bigquery/docs/reference/standard-sql/dml-syntax#update_utilisateur_joines < / P>

    https://cloud.google. Com / BigQuery / Docs / Référence / Standard-SQL / Tableaux # Création_Arrays_From_SubQueries

    https://cloud.google.com/bigquery/docs/reference/standard-sql/arrays#Combiny_arrays


1 commentaires

Ce scénario ne fonctionne pas lorsqu'il n'y a pas de dossier dans la table de destination.



0
votes

Essayez d'utiliser Fusionner Code> Déclaration:

MERGE `dataset.destination` D
USING (select id, array(select data) data from `dataset.source`) S
ON D.id = S.id
WHEN MATCHED THEN
  UPDATE SET data = S.data
WHEN NOT MATCHED THEN
  INSERT (id, data) VALUES(S.id, S.data)


3 commentaires

Avec les données de destination étant un tableau, cette condition ne fonctionne pas !!


@deep a mis à jour la réponse. S'il vous plaît laissez-moi savoir si cela fonctionne maintenant


J'ai mis à jour la question à avoir clarté .. Pouvez-vous vérifier maintenant?



0
votes

J'étais enfin capable de clouer le problème. Pour fusionner 2 enregistrements, je devais recourir à des sous-requêtes poussant dans certains travaux. Bien que, je pense toujours qu'il y a des chances d'amélioration de ce code.

    -- INSERT IDs
INSERT `deep_test.main_table`  (people_id)
 (
   SELECT distinct(people_id) FROM `deep_test.staging_test`
   WHERE people_id NOT IN ( SELECT people_id FROM `deep_test.main_table` )
 );

-- UPDATE TALENT RECORD
UPDATE
  `deep_test.main_table`  gold
SET
  talent = B.talent
FROM
  (
    SELECT
      gold.people_id as people_id,
      ARRAY_AGG(aggregated_stage.talent) as talent
    FROM
      `deep_test.main_table` gold
      JOIN
        (
          SELECT
            A.people_id,
            A.talent
          FROM
            (
              SELECT
                ARRAY_AGG( t
              ORDER BY
                t.createdAt DESC LIMIT 1 )[OFFSET(0)] A
              FROM
                `deep_test.staging_test` t
              GROUP BY
                t.people_id,
                t.talent.people_l_id,
                t.talent.fiscalYear
            )
        ) as aggregated_stage
        ON gold.people_id = aggregated_stage.people_id
        WHERE aggregated_stage.talent is not null
        GROUP BY people_id
  )
  B
WHERE
  B.people_id = gold.people_id;

-- UPDATE COUNTRY CODE
UPDATE `deep_test.core` core
set core.country_code = countries.number
FROM
 (
 select people_id , (select country from UNNEST(talent) as d order by d.fiscalYear DESC limit 1) as country FROM `deep_test.core`
 ) B, `deep_test.countries` countries
WHERE
core.people_id = B.people_id
AND countries.code = B.country;


0 commentaires