2013-06-05 29 views
6

Önceden tanımlanmış sorgular/görünümler dışında Google'ın BigQuery kontrol paneline benzer bir şey oluşturmaya çalışıyorum. İçinde bulunduğum problem veriyi belirliyor.Paganating BigQuery

tabledata endpoint Bana böyle bir şey yapmak için izin veren bir sayfa jetonu bir başlangıç ​​dizini belirtin veya kullanabilmesi sayfa numaralarının destekler:

query_reply = table_data_job.list(projectId=settings.PROJECT_ID, 
            datasetId=settings.DATASET_ID, 
            tableId=table, 
            startIndex=offset, 
            maxResults=page_size).execute() 
bu sorun Belirli sorguları çalıştırmak istiyorum olmasıdır

(ya da en azından tablo verileri sonuçlarını sipariş edin).

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

Benim bildiğim kadarıyla, yukarıdaki kodla bir sapma yapmanın bir yolu yoktur. Bu, BigQuery'nin uygun olmadığı bir şey mi? Alternatif olarak, bellekte sayfalama yapmak ve daha küçük sonuç kümeleri üzerinde çalışmak mı?

cevap

5

BigQuery sorgu sonuçları tablolardır. Böylece bir sorguyu çalıştırabilir ve hedef tabloyu sonuçtan alabilir ve ardından tabledata.list() api kullanarak sonuç sayfalarını tarayabilirsiniz. Alternatif olarak, iş kimliğini yanıttan alabilir ve sayfalama desteğine sahip jobs.getQueryResults()'u kullanabilirsiniz.

1

Yalnızca ROW_NUMBER() İşte

kullanarak SQL ile sayfalama elde edebilirsiniz jenerik şablonu olan

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