BigQuery Scripting est sorti en version bêta le 3 octobre de l'année dernière (2019). Si vous l'utilisez bien, vous pouvez le remplacer par un traitement Python, non? J'étais enthousiaste, mais moi (+ équipe) qui n'est pas si douée en programmation ne sais pas comment m'en servir.
Vous utilisez actuellement "[BigQuery Scripting a été publié en version bêta, alors allons-y doucement](https://medium.com/google-cloud-jp/bigquery-scripting%E3%81%8Cbeta%E3%83" % AA% E3% 83% AA% E3% 83% BC% E3% 82% B9% E3% 81% 95% E3% 82% 8C% E3% 81% 9F% E3% 81% AE% E3% 81% A7 % E8% BB% BD% E3% 81% 8F% E3% 82% A6% E3% 82% A9% E3% 83% BC% E3% 82% AF% E3% 82% B9% E3% 83% AB% E3 % 83% BC% E3% 81% 97% E3% 81% A6% E3% 81% BF% E3% 82% 8B-1408bab2c026) ", mais il est difficile à utiliser.
Après quelques mois d'une telle douleur, j'ai finalement eu un processus de boucle de type Python, donc je vais le partager.
Comme vous le savez, BigQuery peut exécuter un traitement SQL, mais il arrive parfois que vous souhaitiez créer une branche conditionnelle ou une boucle du SQL pour qu'il soit exécuté par une variable externe. Normalement, il est appelé dans un autre langage tel que Python pour créer des branches et répéter le processus SQL, mais le script doit l'intégrer dans BigQuery dans cette mesure. (Peut-être)
Le traitement le plus compréhensible pouvant être utilisé est la référence "Script SQL standard", mais le traitement suivant est possible. Il y a. (Exemple représentatif)
--DECLARE: Déclaration des variables --SET: affectation de valeur à une variable --IF ~ ELSE ~ END IF: branche conditionnelle --LOOP / WHILE: traitement en boucle
Par exemple, si vous souhaitez activer SQL pour chaque magasin et afficher le total des ventes dans des tables distinctes, vous pouvez appeler BigQuery à partir de Python comme suit.
for store in stores:
query=f"""
SELECT
store, SUM(Prix d'achat)AS montant total
FROM `myproject.mydataset.transaction_*`
WHERE store = {store_cd}
GROUP BY store
"""
Les scripts BigQuery disposent également d'un traitement en boucle, ce qui permet de le faire facilement de cette manière. Je pensais. Cependant, "[BigQuery Scripting a été publié en version bêta, alors allons-y légèrement](https://medium.com/google-cloud-jp/bigquery-scripting%E3%81%8Cbeta%E3%83%AA%" E3% 83% AA% E3% 83% BC% E3% 82% B9% E3% 81% 95% E3% 82% 8C% E3% 81% 9F% E3% 81% AE% E3% 81% A7% E8% BB% BD% E3% 81% 8F% E3% 82% A6% E3% 82% A9% E3% 83% BC% E3% 82% AF% E3% 82% B9% E3% 83% AB% E3% 83% BC% E3% 81% 97% E3% 81% A6% E3% 81% BF% E3% 82% 8B-1408bab2c026) » Vous ne pouvez pas faire quelque chose comme une itération de tableau comme vous le feriez dans une boucle Python.
Je voulais le faire d'une manière ou d'une autre.
Le processus suivant a finalement été fait à travers divers essais et essais pour voir si quelque chose pouvait être fait.
#Déclaration des variables
DECLARE stores ARRAY<STRING>; #Créez un tableau appelé stores et exécutez la boucle
DECLARE x INT64 DEFAULT 1; #Arguments utilisés dans les magasins (valeur par défaut = 1)
#Affectation à une variable
#Je voulais créer automatiquement la valeur ARRAY (liste de magasins), donc ARRAY_Créé avec AGG
SET stores = (
SELECT ARRAY_AGG(store_cd) as list
FROM (SELECT store_cd FROM `myproject.mydataset.mytable` GROUP BY store_cd ORDER BY store_cd)
);
#Traitement en boucle
#Répétez jusqu'à la longueur des magasins
WHILE x <= array_length(stores) DO
SELECT store_cd, SUM(Prix d'achat)AS montant total
FROM `myproject.mydataset.mytable`
WHERE store_cd=stores [ORDINAL(x)] #Récupérer la Xème valeur des magasins
GROUP BY store_cd;
SET x = x + 1;
END WHILE;
Ouaip. D'une manière ou d'une autre, j'ai pu effectuer un traitement en boucle qui semble être utilisé dans l'ancien JAVA.
Pour le moment, le traitement en boucle n'était possible que pendant BigQuery. En premier lieu, j'ai écrit sans trop utiliser ARRAY, donc c'était pénible d'utiliser ce processus. (Si tu peux, ça semble facile)
À l'avenir, j'aimerais relever le défi du branchement conditionnel (instruction IF).
Recommended Posts