1

Ich bin noch ziemlich neu im Google Cloud Datalab und habe einige Probleme beim Ausführen parametrisierter Abfragen.Parameter für TABLE_QUERY in Google Cloud Datalab übergeben iPython-Notizbuch

ich das Beispiel für das Bestehen Abfrageparameter von Datalab tutorial gefolgt und versuchte es auf der folgenden Abfrage anwenden:

%sql 
SELECT user_id, localTime, event 
FROM (SELECT user_id, DATE_ADD(date, timezoneOffset, "SECOND") AS localTime, event 
    FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_0" 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 
    WHERE 
    user_id IS NOT NULL AND 
    timezoneOffset IS NOT NULL AND 
    event IS NOT NULL) 
WHERE 
    user_id IN (SELECT id FROM [my_project:my_dataset.topUsers]) 
ORDER BY user_id, localTime 

ich alle user_events Tabellen iterieren möchten, mit Indizes 0,1,2, 3 ... Zu diesem Zweck möchte ich den Parameter für die TABLE_QUERY übergeben und jede Tabelle in einer Iteration einer Schleife abfragen - nicht alle Tabellen gleichzeitig. (Weil ich brauche Benutzer Datensätze in jeder Tabelle, um zu bestellen, die Ressourcen überschritten werden, wenn eine Abfrage über alle user_events Tabellen auf einmal ausgeführt wird)

1.) ich eine neue Abfrage definiert (%%sql --module topUserEvents etc.) und ersetzt die folgenden Teil aus der Abfrage oben:

FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_0" 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 

mit:

FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS "user_events_'+$tableNr+ 
     '" AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 

die Abfrage ausgeführt, Tabellennummer als String übergeben - hat nicht funktioniert:

invalidQuery: Expected a string literal for TABLE_QUERY clause 

2.) Ich habe auch versucht die ganze String übergeben, ein Teil der ursprünglichen Abfrage mit dem Ersetzen:

FROM (TABLE_QUERY([my_project:my_dataset:user_events], $tableString)) 

die Abfrage ausgeführt, die gesamte Zeichenfolge vorbei, kehrte Big Abfrage Ausnahme:

invalidQuery: Error preparing subsidiary query: 
com.google.cloud.helix.server.bqsql.common.BigQueryException: 
Encountered " "CONTAINS" "CONTAINS "" at line 1, column 94. 
Was expecting: 
")" ... 

Kennt jemand wie (einen Teil), wie in dem Fall eine Zeichenfolge für TABLE_QUERY Parameter ab passieren Ove?

Jede Hilfe würde sehr geschätzt werden :)

Antwort

1

Können Sie Folgendes versuchen?

definieren Modul 'test1':

%%sql --module test1 
SELECT count(*) 
FROM TABLE_QUERY(publicdata:samples, 
    'MSEC_TO_TIMESTAMP(creation_time) < DATE_ADD(CURRENT_TIMESTAMP(), -7, $period)') 

Run query:

period = 'DAY' 
bq.Query(test1, period = period).sample() 

definieren Modul 'test2':

%sql --module test2 
SELECT user_id, localTime, event 
FROM (SELECT user_id, DATE_ADD(date, timezoneOffset, "SECOND") AS localTime, event 
    FROM (TABLE_QUERY([my_project:my_dataset:user_events], 
     'table_id CONTAINS $events_table_num 
     AND RIGHT(table_id, 8) BETWEEN "20160401" AND "20160408"')) 
    WHERE 
    user_id IS NOT NULL AND 
    timezoneOffset IS NOT NULL AND 
    event IS NOT NULL) 
WHERE 
    user_id IN (SELECT id FROM [my_project:my_dataset.topUsers]) 
ORDER BY user_id, localTime 

Run query:

events_table_num = 'user_events_0' 
bq.Query(test2,events_table_num = events_table_num).sample() 
+1

Vielen Dank!Ich versuchte auch eine ähnliche Lösung, aber funktionierte nicht, weil ich die Anführungszeichen um das übergebene Argument verwendete; 'FROM (TABLE_QUERY ([my_project: my_dataset: user_events], 'table_id CONTAINS" $ events_table_num " UND RECHTS (table_id, 8) ZWISCHEN" 20160401 "UND" 20160408 "'))' Das ergab für mich, aber für einige Deshalb müssen die Anführungszeichen weggelassen werden, um zu arbeiten. Danke nochmal :) – user2107356

Verwandte Themen