2017-07-11 7 views
2

Je suis relativement nouveau au concept de données imbriquées et j'essaie d'obtenir la bonne façon d'aplatir certaines données GA dans BigQuery (https://support.google.com/analytics/answer/3437719?hl=en). Maintenant, pour donner un peu de contexte, pour chaque session de visiteur, j'essaye de capturer la liste des références de produits qui ont été regardées (vue détaillée) et s'il y avait une transaction, l'identifiant de transaction. Pour mon compte, et après avoir fait un peu de recherche, la façon la plus simple de faire cela ressemble à cela, en utilisant GAUCHE REJOINT pour ramener tout:BigQuery UNNEST Pas de résultats

SELECT fullVisitorId as uId, visitId as vId, h.transaction.transactionId as 
trId, STRING_AGG(p.productSKU, "|") as skus 
FROM 
`test-bigquery.12345678.ga_sessions_*` t 
    LEFT JOIN UNNEST(hits) h 
    LEFT JOIN UNNEST(h.product) p 
WHERE 
_TABLE_SUFFIX = '20170709' 
AND h.eCommerceAction.action_type = '2' 
GROUP BY uId, vId, trId 

Cependant, cela semble donner aucun résultat où Trid est non nul J'ai ensuite essayé de séparer ce qui précède en deux requêtes et en les rejoignant. Cela semble fonctionner et renvoie un nombre apparemment raisonnable de lignes (~ 1000) où trId n'est pas nul.

WITH skus AS 
(SELECT fullVisitorId as uId, visitId as vId, STRING_AGG(p.productSKU, "|") as skus 
    FROM 
    `test-bigquery.12345678.ga_sessions_*` t 
     LEFT JOIN UNNEST(hits) h 
     LEFT JOIN UNNEST(h.product) p 
    WHERE 
    _TABLE_SUFFIX = '20170709' 
    AND h.eCommerceAction.action_type = '2' 
    GROUP BY uId, vId), 
transactions AS 
    (SELECT fullVisitorId as uId_trans, visitId as vId_trans, h.transaction.transactionId as trId 
    FROM 
    `test-bigquery.12345678.ga_sessions_*` t 
     LEFT JOIN UNNEST(hits) h 
    WHERE 
     _TABLE_SUFFIX = '20170709' 
     AND h.transaction.transactionId IS NOT NULL 
     GROUP BY uId_trans, vId_trans, trId) 
SELECT skus.uId, skus.vId, transactions.trId, skus.skus 
FROM skus 
LEFT JOIN transactions ON transactions.vId_trans = skus.vId AND transactions.uId_trans = skus.uId 

Ce serait génial si quelqu'un pourrait expliquer pourquoi les deux ne donnent pas la même réponse et je l'espère me donner les moyens de s'impliquer avec toutes sortes de plaisir imbriqué dans l'avenir .... Merci!

Répondre

1

L'erreur que vous avez fait se passe dans cette ligne:

AND h.eCommerceAction.action_type = '2'

Si vous cochez ga sessions schema pour le champ action_type, vous verrez que lorsque le client est sa valeur « 2 » est tout simplement voir la produit et c'est «6» lorsque la transaction est arrivée. Donc, si vous filtrez uniquement les actions égales à '2', vous ne pourrez pas obtenir les transactions étant donné que leur valeur est '6'.

Dans votre deuxième requête, notez que votre requête pour transactions ne filtre plus lorsque l'action est '2' mais plutôt où trasactionId n'est pas nulle, donc vous récupérez maintenant ces lignes.

Il y a encore des façons dont vous pouvez grandement optimiser votre requête, par exemple:

SELECT 
    fullvisitorid, 
    visitid, 
    ARRAY(SELECT STRUCT(prods.productsku AS sku, MAX(IF(hits.ecommerceaction.action_type = '6', hits.transaction.transactionID, NULL)) AS transactionID) FROM UNNEST(hits) hits, UNNEST(hits.product) prods WHERE hits.ecommerceaction.action_type IN ('2', '6') GROUP BY prods.productsku) result 
FROM `test-bigquery.12345678.ga_sessions_*` 
WHERE TRUE 
    AND _TABLE_SUFFIX = '20170709' 
    AND EXISTS(SELECT 1 FROM UNNEST(hits) hits WHERE hits.ecommerceaction.action_type IN ('2', '6')) 
LIMIT 1000 

Cette requête donne les mêmes résultats que le vôtre, mais il est plus succinct et ont de meilleures performances (il évite les JOIN inutiles s et UNNEST s opérations et fait bon usage de la structure ARRAYs et STRUCTs dans les données).

Je vous recommande fortement d'apprendre à utiliser ces techniques avec des données imbriquées, car vous pourrez interroger des centaines de gigas en quelques secondes. Ce sont les résultats que je suis entré dans mon jeu de données:

enter image description here

Il a traité plus de 500Gbs en 15s.

+0

Une réponse fantastique, succincte, et quel gentil pour aller au-delà et suggérant comment je pourrais optimiser les choses pour rendre mon travail plus lisse. @Will merci !! – jptk