2013-06-05 14 views
6

Ich versuche etwas ähnliches wie das BigQuery-Dashboard von Google zu erstellen, außer mit vordefinierten Abfragen/Ansichten. Das Problem, in das ich hineingeraten bin, paginiert die Daten.Paginieren von BigQuery

Die tabledata endpoint unterstützt Paginierung, dass Sie einen Startindex angeben oder eine Seite-Token verwenden, so dass mir so etwas tun:

query_reply = table_data_job.list(projectId=settings.PROJECT_ID, 
            datasetId=settings.DATASET_ID, 
            tableId=table, 
            startIndex=offset, 
            maxResults=page_size).execute() 

Das Problem dabei ist, dass ich bestimmte Abfragen ausführen möchten (oder zumindest die Ergebnisse der Tabellendaten anordnen).

query_data = {'query': 'SELECT * FROM my_dataset.foo_table LIMIT %s' % page_size} 
query_reply = job_collection.query(projectId=settings.PROJECT_ID, 
            body=query_data).execute() 

Meiner Kenntnis nach gibt es keine Möglichkeit, einen Offset mit dem obigen Code zu machen. Ist das etwas, für das BigQuery nicht geeignet ist? Ich denke, die Alternative wäre, die Paginierung im Gedächtnis zu machen und an kleineren Ergebnismengen zu arbeiten?

Antwort

5

BigQuery-Abfrageergebnisse sind Tabellen. So können Sie eine Abfrage ausführen und die Zieltabelle aus dem Ergebnis abrufen und dann die Ergebnisse mithilfe der tabledata.list() API durchblättern. Alternativ können Sie die Job-ID aus der Antwort abrufen und jobs.getQueryResults() verwenden, die Paginierungsunterstützung unterstützt.

1

Sie können Paginierung mit SQL erreichen nur durch ROW_NUMBER()

ist hier generische Vorlage

SELECT t.* 
FROM (
SELECT 
1 AS one, 
[field], 
ROW_NUMBER() OVER(PARTITION BY one) AS rownum 
FROM [table]) t WHERE rownum BETWEEN X AND Y