2013-06-05 7 views
6

Sto tentando di creare qualcosa di simile alla dashboard di Google BigQuery, salvo con query/viste predefinite. Il problema che sto incontrando è la paginazione dei dati.Impaginazione BigQuery

Il tabledata endpoint supporta impaginazione in quanto è possibile specificare un indice di partenza o di utilizzare una pagina di token, che mi permette di fare qualcosa di simile:

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

Il problema di questo è che vorrei eseguire query specifiche (o, per lo meno, ordinare i risultati dei dati della tabella).

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() 

A mia conoscenza, non c'è modo di fare un offset con il codice di cui sopra. Questo è solo qualcosa per cui BigQuery non è adatto? Immagino che l'alternativa sarebbe fare l'impaginazione in memoria e lavorare su set di risultati più piccoli?

risposta

5

I risultati della query BigQuery sono tabelle. Quindi è possibile eseguire una query e ottenere la tabella di destinazione dal risultato e quindi sfogliare i risultati utilizzando l'API tabledata.list(). In alternativa è possibile ottenere l'id del lavoro dalla risposta e utilizzare jobs.getQueryResults(), che ha il supporto per l'impaginazione.

1

È possibile ottenere l'impaginazione con SQL solo utilizzando ROW_NUMBER()

Ecco modello generico

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