2017-07-11 3 views
2

Ich bin relativ neu im Konzept der verschachtelten Daten und versuche, meinen Kopf auf den richtigen Weg zu bringen, um einige GA-Daten in BigQuery zu glätten (https://support.google.com/analytics/answer/3437719?hl=en).BigQuery UNNEST Keine Ergebnisse

Nun um einen Kontext zu geben, versuche ich für jede Besuchersitzung die Liste der betrachteten Produkt-SKUs zu erfassen (Detailansicht) und wenn es eine Transaktion gab, die Transaktions-ID. Durch meine Rechnung, und nach ein wenig Forschung zu tun, der einfachste Weg, dies zu tun, sieht wie folgt aus, mit LEFT JOINS alles zurück zu bringen:

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 

Allerdings scheint dies Null Ergebnisse zurück, wo TrID nicht null ist ....

Ich habe dann versucht, die oben genannten in zwei Abfragen zu trennen und zu verbinden. Dies scheint zu funktionieren und ergibt eine scheinbar vernünftige Anzahl von Zeilen (~ 1000), wobei trId nicht null ist.

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 

Es wäre fantastisch, wenn jemand erklären könnte, warum die beide mich mit allen Arten von verschachteltem Spaß in der Zukunft .... Danke einlassen nicht die gleiche Antwort geben und hoffentlich ausrüsten!

Antwort

1

Der Fehler, den Sie in dieser Zeile gemacht passiert:

AND h.eCommerceAction.action_type = '2'

Wenn Sie ga sessions schema für das Feld action_type überprüfen, werden Sie sehen, dass der Wert ‚2‘ ist, wenn der Kunde nur das Sehen ist Produkt und es ist "6", wenn die Transaktion passiert ist. Wenn Sie also nur Aktionen ausfiltern, die gleich '2' sind, können Sie die Transaktionen nicht erhalten, wenn ihr Wert '6' ist.

In Ihrer zweiten Abfrage, feststellen, dass Ihre Abfrage für transactions nicht mehr herausgefiltert werden, wo Aktion ‚2‘ ist, sondern wo trasactionId ist nicht null, so dass Sie erfolgreich nun die Zeilen abzurufen sind.

Es gibt immer noch Möglichkeiten gibt, in denen sie stark Ihre Abfrage, zum Beispiel optimieren können:

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 

Diese Abfrage liefert die gleichen Ergebnisse wie bei Ihnen tut, aber es ist mehr prägnant und haben eine höhere Leistung (es vermeidet die unnötige JOIN s und UNNEST s Operationen und nutzt die ARRAYs und STRUCTs Struktur in den Daten).

Ich empfehle dringend zu lernen, wie Sie diese Techniken mit verschachtelten Daten verwenden, wie Sie Hunderte von Gigas in wenigen Sekunden abfragen können. Dies sind die Ergebnisse, die ich in meinem Dataset bekam:

enter image description here

Es ist mehr als 500 GB verarbeitet in 15s.

+0

Eine fantastische, prägnante Antwort, und was für ein Gentleman, um darüber hinaus zu gehen und vorzuschlagen, wie ich Dinge optimieren könnte, um meine Arbeit leichter zu machen. @Will danke !! – jptk

Verwandte Themen