2017-07-11 20 views
2

ネストされたデータの概念は比較的新しいので、BigQuery(https://support.google.com/analytics/answer/3437719?hl=en)でいくつかのGAデータをフラット化するための正しい方法で頭を上げようとしています。BigQuery UNNESTいいえ結果

ここで、訪問者セッションごとに、私が見た製品SKUのリスト(詳細ビュー)をキャプチャしようとしています。トランザクションがあった場合はトランザクションIDです。

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 

しかし、これはTRIDがnullでない場合、ゼロの結果を返すように表示されます。私の起算することにより、研究のビットを行った後、これを実行する最も簡単な方法は、LEFTはすべてを戻すためにJOINを使用して、次のようになります....

私は上記の2つのクエリと結合に分かれて行きました。これはうまくいくと思われ、trIdがnullでないような一見賢明な数の行(〜1000)を返します。誰かが2つが同じ答えを与えていない理由を説明し、うまくいけば、私は将来....おかげで、ネストされた楽しみのすべての方法で参加するために装備することができれば

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 

はそれは素晴らしいだろう!

答えて

1

あなたが作った間違いは、このラインで起こっている:

AND h.eCommerceAction.action_type = '2'

あなたがフィールドaction_typeためga sessions schemaをチェックする場合は、その値が「2」顧客はただ見ていることがわかりますトランザクションが発生したときには '6'と表示されます。したがって、 '2'に等しいアクションだけを除外すると、その値が '6'であれば、トランザクションを取得することはできません。

2番目のクエリでは、transactionsのクエリは、アクションが '2'でなく、むしろtrasactionIdがnullでない場合、それらの行を今すぐ検索していることに注意してください。

はまだあなたが大幅たとえば、クエリを最適化できる方法があります:あなたはありませんが、それはより簡潔だとより高い性能を有するよう

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 

このクエリは、同じ結果が得られます(それが不要JOINを回避しますsおよびUNNESTの操作を行い、データ内のARRAYおよびSTRUCT構造体を有効に使用します)。

これらの手法をネストされたデータで使用する方法を学ぶことをお勧めします。数百のギガを数秒で照会できるようになります。

enter image description here

それは15秒で500Gbs以上処理:これらは私が私のデータセットになった結果です。

+0

幻想的で簡潔な答え、それを超えて私が仕事を滑らかにするために物を最適化する方法を示唆しています。 @ありがとう! – jptk

関連する問題