2017-09-01 6 views
1

J'utilise Standard SQL.Même si c'est une requête de base, elle génère toujours des erreurs. Toutes les suggestions plsErreur de requête échouée: ressources dépassées lors de l'exécution de la requête: la requête n'a pas pu être exécutée dans la mémoire allouée

SELECT 
    fullVisitorId, 
    CONCAT(CAST(fullVisitorId AS string),CAST(visitId AS string)) AS session, 
    date, 
    visitStartTime, 
    hits.time, 
    hits.page.pagepath 
FROM 
    `XXXXXXXXXX.ga_sessions_*`, 
    UNNEST(hits) AS hits 
WHERE 
    _TABLE_SUFFIX BETWEEN "20160801" 
    AND "20170331" 
ORDER BY 
    fullVisitorId, 
    date, 
    visitStartTime 

Répondre

4

La seule façon pour cette requête au travail est en supprimant la commande appliquée à la fin:

SELECT 
    fullVisitorId, 
    CONCAT(CAST(fullVisitorId AS string),CAST(visitId AS string)) AS session, 
    date, 
    visitStartTime, 
    hits.time, 
    hits.page.pagepath 
FROM 
    `XXXXXXXXXX.ga_sessions_*`, 
    UNNEST(hits) AS hits 
WHERE 
    _TABLE_SUFFIX BETWEEN "20160801" 
    AND "20170331" 

ORDER BY opération est très coûteuse et ne peut pas être traité en parallèle alors essayez d'éviter (ou essayez de l'appliquer dans un jeu de résultats limité)

+0

Merci Willian. Cela fonctionne, mais pouvez-vous me dire la raison pour laquelle cela ne fonctionnait pas lorsque j'utilise l'ordre par. – Harish

+2

Il y avait trop de lignes à conserver en mémoire sur un seul nœud. Si vous regardez l'onglet "Explication" pour la requête, il montrera où il manquait de mémoire. –

+0

Merci @ElliottBrossard – Harish

0

Outre la réponse acceptée, vous pouvez partitionner votre table par date pour réduire la quantité de mémoire utilisée avec une requête coûteuse.

+0

La requête ci-dessus est de tirer les données GA et par défaut, il est partitionné par date. _TABLE_SUFFIX ENTRE "20160801" ET "20170331" Voici comment je tire des données de différentes plages de dates – Harish