2014-08-30 8 views
12

Abbiamo un account Google Analytics premium, che ci darà accesso ai dati degli eventi a livello di riga. Questi dati vengono esportati giornalmente su Google Bigquery e per ogni giorno verrà creata una nuova tabella in un set di dati.Appiattimento dei dati di Google Analytics (con campi ripetuti) non funziona più

Fino a una settimana fa, siamo stati in grado di esportare questi dati di Google Analytics in CSV ridimensionandoli a una tabella di gestione temporanea temporanea e quindi esportarli in CSV. La query abbiamo usato per fare così è stato in questo modo:

SELECT * FROM 
    flatten([xxxxxxxx.ga_sessions_20140829],hits), 
    flatten([xxxxxxxx.ga_sessions_20140828],hits), 
    flatten([xxxxxxxx.ga_sessions_20140827],hits), 
    flatten([xxxxxxxx.ga_sessions_20140826],hits) 

Ieri ho notato questa query sarà ora gettare un errore:

Cannot output multiple independently repeated fields at the same time. Found customDimensions_value and hits_product_productSKU 

A quanto pare qualcosa è cambiato per quanto riguarda la funzione di appiattire(), come hits_product_productSKU è figlio del campo dei colpi.

Ho anche provato alcune vecchie query presenti nella cronologia delle query, ma sono anche danneggiate. Non c'è alcuna nota di rilascio che menzioni alcun cambiamento, quindi cosa sta succedendo?

Come posso esportare nuovamente tutti i file di esportazione BigQuery di Google Analytics?

+1

Ho appena riscontrato questo problema su alcune query che hanno funzionato correttamente.Non riesco a trovare eventuali note su un cambiamento sia, ma qualcosa ha sicuramente ... – NathanS

+1

Questo è molto negativo per Google per rompere la compatibilità – Tjorriemorrie

risposta

14

Questo è in realtà il risultato di un bugfix ho presentato la scorsa settimana, e vi impedisce di ottenere risultati non corretti.

BigQuery per impostazione predefinita appiattisce tutti i risultati della query prima di restituirli, ma si desidera appiattire un campo ripetuto in modo indipendente per evitare un'espansione di dati tra più prodotti. Il bug era che i nostri controlli per più campi ripetuti non riuscivano a tenere conto della ripetitività dei record padre in alcuni casi, il che ci ha portato a non appiattire alcuni campi ripetuti in modo indipendente. Ciò significava che potevamo restituire righe piatte dove i valori ripetuti indipendentemente venivano effettivamente "appiattiti" in valori ripetuti, invece di generare il prodotto incrociato, che in realtà è un risultato errato.

Quello che vedete qui è il risultato del controllo più severo: avete (almeno) due campi ripetuti nello schema di output prima di tentare di appiattire i risultati.

Un'altra cosa importante da notare è che la funzione FLATTEN ([valore tabella], [campo]) appiattisce solo la ripetitività del campo specificato come secondo argomento. Quando dici appiattisci ([xxxxxxxx.ga_sessions_20140829], hit), stai appiattendo solo il record "hits". Se vuoi anche appiattire i suoi figli ripetuti (prodotto, promozione, ecc.) Devi aggiungere esplicitamente un altro appiattimento per quei campi, come:

FLATTEN (FLATTEN ([xxxxxxxx.ga_sessions_20140829], colpi), hits.prodotto)

-

avete un paio opzioni per rendere il vostro esempio di lavoro:

1) Selezionare un numero inferiore di campi. Se ti interessa solo ottenere l'output appiattito di alcuni campi, puoi rimuovere i campi ripetuti in modo indipendente dai risultati della query selezionando esplicitamente solo i campi che ti interessano.

2) Aggiungere altri FLATTEN. Avrai bisogno di appiattire su ogni campo ripetuto, che sembra includere almeno colpi, hits.product e customDimensions. Potresti scoprire che il messaggio di errore si lamenterà di diversi campi ripetuti: aggiungi altri FLATTEN sui campi ripetuti nello schema finché non funziona.

+2

Che ne dici di una funzione flatten_all? Vogliamo importare tutti i dati nel nostro data warehouse, quindi nidificare 5 o più query appiattite sembra un po 'hacky ... –

+1

Per motivi di interesse, perché "FLATTEN" non può prendere un numero arbitrario di campi da appiattire ? per esempio. 'Appiattire (tavolo, campo1, campo2)' – Mullefa

+0

Questo funziona. È davvero molto fastidioso scrivere tutti gli appiattiti. Sembra che una migliore API potrebbe essere in ordine. – fraxture

0

Sospetto che le tabelle generate da Google Analytics Premium siano state integrate con l'aggiunta di nuove colonne. L'aggiunta di colonne non dovrebbe essere un problema, a meno che le tue query non utilizzino il selettore * e una delle nuove colonne contenga valori nidificati.

Soluzione consigliata: anziché utilizzare *, chiedere esplicitamente le colonne necessarie.

+0

Felipe, nel mio caso non sto usando GA o le selezioni *. In passato selezionare colonne specifiche appiattiva gli oggetti nidificati. I dati sono stati caricati da JSON nidificato. query di esempio: 'SELECT [datasource_id] AS [datasource_id], [mentions.mentioned_name] AS [mentions_mentioned_name], [links.title] AS [links_title], [links.url] AS [links_url] FROM [data.posts] [ messaggi] ' l'errore che ora ottengo è: non può emettere più campi ripetuti in modo indipendente allo stesso tempo. mentions_mentioned_name trovato e links_title In passato si espanderebbe le colonne vuote per null. – NathanS

+0

Id del lavoro o query di lavoro (non riuscite) da investigare per favore! –

3

Se si sta utilizzando la console Web BigQuery, selezionare una tabella Destinazione, fare clic su gettare grande Risultati e deselezionare Flatten Risultati.

Se si sta utilizzando lo strumento da riga di comando bq:

bq query --allow_large_results --noflatten --destination_table NAME_OF_TABLE "SELECT * from FLATTEN([dataset], hits)" 
0

È necessario utilizzare appiattire la query prima della connessione. Basta scegliere i campi che sono menzionati nel l'errore e utilizzare l'appiattimento nidificato:

SELECT * FROM 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140829],hits),customDimensions_value),hits_product_productSKU), 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140828],hits),customDimensions_value),hits_product_productSKU), 
flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140827],hits),customDimensions_value),hits_product_productSKU), flatten(flatten(flatten([xxxxxxxx.ga_sessions_20140826],hits),customDimensions_value),hits_product_productSKU) 
1

Per coloro che vogliono importare i dati GA ad un database relazionale: Si prega di essere consapevole del fatto che uno schema annidato è in realtà mettere più tabelle relazionali in una struttura nidificata - sono equivalenti, quindi l'appiattimento semplice non è la soluzione migliore qui: vuoi separato di nuovo i tavoli! In questo modo si risparmia molto spazio nell'archiviazione e le query potrebbero essere più veloci.

Si può pensare di dati di GA che sono 3 tabelle relazionali:

  • sessioni tavolo
  • tavolo colpi tavolo
  • prodotti

Per ottenere tabella delle sessioni è possibile usare qualcosa come

-- session table 
SELECT 
    * EXCEPT(hits, 
    customDimensions), 
    CONCAT('{',(
    SELECT 
     STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM 
     t.customdimensions),'}') as customDimensions 
FROM 
    `project.dataset.ga_sessions_20171031` AS t 

customDimensions è aggregato a una stringa json.

Allo stesso modo con la tabella di risultati:

-- hits table 
SELECT 
fullvisitorid, 
visitid, 
visitstarttime, 
h.* EXCEPT(product, 
customdimensions, customMetrics, customVariables, promotion, experiment), 
CONCAT('{',(
    SELECT 
    STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM 
    h.customdimensions),'}') AS hitsCustomDimensions, 
CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string))) 
    FROM h.custommetrics),'}') AS hitsCustomMetrics 
FROM 
`project.dataset.ga_sessions_20171031` AS t, 
t.hits AS h 

È possibile aggiungere la promozione e sperimentare come ho fatto con customDimensions utilizzando un sub-select.

Registrati sessioni con colpi utilizzando una concatenazione di fullVisitorId + visitstarttime/visitid (sessioni GA includono mezzanotte spaccata: utilizzare visitStartTime invece di visitid Se si desidera ignorare la mezzanotte uso frazionato visitid - rimane lo stesso, nonostante la scissione)

per i prodotti che ci si aggiunge il numero di hit al tuo 'id di sessione' per ottenere un identificatore univoco:

-- product table 
SELECT 
    fullvisitorid, 
    visitid, 
    visitstarttime, 
    h.hitNumber, 
    p.* EXCEPT(customdimensions, customMetrics), 
    CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':"',value,'"')) 
    FROM p.customdimensions),'}') AS productsCustomDimensions, 
    CONCAT('{',(
    SELECT STRING_AGG(CONCAT(CAST(index AS string),':',cast(value as string))) 
    FROM p.custommetrics),'}') AS productsCustomMetrics 
FROM 
    `project.dataset.ga_sessions_20171031` AS t, 
    t.hits AS h, h.product as p 

Ora avete 3 relazionali/tavoli "flat" si può aderire come necessario in qualsiasi relazionale db.