2013-10-02 2 views
5

Мы работаем над написанием обертки для bq.py и имеем некоторые проблемы с наборами результатов размером более 100 тыс. Строк. Похоже, в прошлом это отлично работало (у нас были проблемы с Google BigQuery Incomplete Query Replies on Odd Attempts). Возможно, я не понимаю ограничения, объясненные на doc page?bq.py Not Paging Results

Например:

#!/bin/bash 

for i in `seq 99999 100002`; 
do 
    bq query -q --nouse_cache --max_rows 99999999 "SELECT id, FROM [publicdata:samples.wikipedia] LIMIT $i" > $i.txt 
    j=$(cat $i.txt | wc -l) 
    echo "Limit $i Returned $j Rows" 
done 

Урожайность (обратите внимание, что 4 строки форматирования):

Limit 99999 Returned 100003 Rows 
Limit 100000 Returned 100004 Rows 
Limit 100001 Returned 100004 Rows 
Limit 100002 Returned 100004 Rows 

В нашей обертке, мы прямой доступ к API:

while row_count < total_rows: 
    data = client.apiclient.tabledata().list(maxResults=total_rows - row_count, 
               pageToken=page_token, 
               **table_dict).execute() 

    # If there are more results than will fit on a page, 
    # you will recieve a token for the next page 
    page_token = data.get('pageToken', None) 

    # How many rows are there across all pages? 
    total_rows = min(total_rows, int(data['totalRows'])) # Changed to use get(data[rows],0) 
    raw_page = data.get('rows', []) 

Мы ожидал бы получить токен в этом случае, но никто не возвращается.

ответ

1

Извините, мне потребовалось некоторое время, чтобы вернуться к вам.

Я смог идентифицировать ошибку, которая существует на стороне сервера, вы бы увидели это с клиентом Java, а также с клиентом python. На следующей неделе мы планируем выпустить исправление. Ваш клиент должен начать вести себя правильно, как только это произойдет.

BTW, я не уверен, что вы знали это уже или нет, но есть отдельный автономный клиент python, который вы можете использовать для доступа к API с питона. Я думал, что это может быть немного более удобным для вас, чем клиент, который распространяется как часть bq.py. Вы найдете ссылку на нее на этой странице: https://developers.google.com/bigquery/client-libraries

+0

Спасибо за информацию - мы с нетерпением ждем изменения. Мы знаем об API-клиентах и ​​изначально использовали его исключительно. Однако мы столкнулись с многочисленными проблемами, некоторые из-за изменений API, которые заставили нас рассмотреть альтернативы. bq.py реализует почти все необходимые нам функции, и я очень люблю повторное использование проверенного кода, когда это возможно.Кроме того, встроенный код потока аутентификации намного более плавный, чем то, что я мог бы придумать :-) Пожалуйста, сообщите нам, когда изменения будут вживую. –

+0

Hey Jacob, Сделайте снимок прямо сейчас и сообщите мне, если у вас все еще есть проблема. – Eric

+0

Было ли это фоновым изменением, или мне нужно сделать что-то другое? Демонстрационный сценарий, который я дал выше, генерирует те же неправильные результаты. Аналогично, наша оболочка вокруг кода все еще не работает для подобных запросов. –

1

Я могу воспроизвести поведение, которое вы видите, с помощью командной строки bq. Это похоже на ошибку, я посмотрю, что я могу сделать, чтобы исправить это.

Одна вещь, которую я заметил о данных, которые вы запрашивали, заключалась в том, что выбор только поля id и ограничение количества строк около 100 000. Это дает около 1 млн. Данных, поэтому сервер, скорее всего, не будет разбивать на страницы результаты. Выбор большего объема данных заставит сервер разбиваться на страницы, поскольку он не сможет вернуть все результаты в один ответ. Если вы сделали выбор * для 100 000 строк samples.wikipedia, вы получите ~ 50M назад, что должно быть достаточно, чтобы начать видеть, что происходит разбиение на страницы.

Вы видите слишком мало результатов от клиента python, или вы были удивлены тем, что не было возвращено ни одного page_token для вашего запроса sample.wikipedia?

+0

Оба на самом деле - у меня создалось впечатление, что разбиение на страницы было основано на размере строки, а не на необработанном размере данных. Документация довольно сбивает с толку по этому вопросу, в частности, когда разбивается страница и что представляет собой максимальный набор результатов. Несмотря на это, мы по-прежнему получаем слишком мало строк как в bq.py, так и в нашем коде, который вызывает API напрямую (используя bq.py в качестве драйвера). –

+0

Есть ли временная шкала для этого исправления? Это серьезное ограничение для нашего текущего рабочего процесса. По-видимому, это проблема API, и я ожидаю, что это повлияет и на других клиентов. –

+0

Является ли эта проблема и для клиента API Java? У нас есть некоторые анализы, которые немного стоят на месте, и мы ищем какое-то обходное решение. Будет ли это требовать изменения кода клиента? Мы готовимся к выпуску модуля соединителей, и мы должны быть уверены, что требования к зависимостям прекрасны. –