2013-11-29 3 views
4

Возможно, BigQuery может вернуть сжатый/gzip-ответ? я заметил, при выполнении запроса, как:BigQuery сжатый ответ

select * from [dataSet.tableId] 

из таблицы с большим количеством столбцов (schema), но только 1 Мбайт по размеру, ответ 13mb. Понятно, что BigQuery FLATTENs является одной из записей, поэтому ответ больше из-за структуры JSON. Однако результирующая таблица в BigQuery имеет размер 2.04 МБ. Я не использую никаких клиентских библиотек BigQuery, но вместо этого вместо этого выполняю прямые HTTP-запросы. Есть ли работа вокруг, чтобы получить меньший ответ с фактическими таблицами?

Благодаря

ответ

2

Чтобы получить сжатый вывод с использованием необработанного HTTP-API, вам необходимо указать два заголовка - заголовки User-Agent и Accpet-Encoding. Пользователь-агент должен быть тем, который, как известно, способен обрабатывать gzip.

Accept-Encoding: deflate, gzip 
User-Agent: gzip 

Существует более подробную информацию в AppEngine документации здесь: http://code.google.com/appengine/kb/general.html#compression. В то время как BigQuery не является AppEngine, он разделяет многие части сетевой инфраструктуры AppEngine, в том числе определение того, когда на сервер сжатый контент.

+0

Это именно то, что мне нужно. Благодаря :) –

2

Вы можете использовать коллекцию tabledata пролистывать данные в таблице. (обратите внимание, что если вы используете jobs.getQueryResults(), то работает тот же метод.

Также обратите внимание на то, что действительно есть веская причина использовать запросы «select *», поскольку tabledata.list () операция может позволить вам прочитать данные из таблицы и «выберите *» запрос стоит денег, в то время как tabledata.list() не

например:.

PROJECT=my_project 
DATASET=my_dataset 
TABLE=my_table 
BASE_URL=https://www.googleapis.com/bigquery/v2 
TABLES_URL=${BASE_URL}/projects/${PROJECT}/datasets/${DATASET}/tables 
TABLEDATA_URL=${TABLES_URL}/${TABLE}/data 
curl -H "Authorization: Bearer ${AUTH_TOKEN}" \ 
    -H "Content-Type: application/json" \ 
    -X GET \ 
    "${TABLEDATA_URL}?maxResults=10" 

Обратите внимание, что это будет возвращать поле «pageToken». Вы можете использовать это для получения следующей страницы результатов:

PAGE_TOKEN=<page token from response> 
curl -H "Authorization: Bearer ${AUTH_TOKEN}" \ 
    -H "Content-Type: application/json" \ 
    -X GET \ 
    "${TABLEDATA_URL}?maxResults=10&pageToken=${PAGE_TOKEN}" 
+0

Вы абсолютно правы, что выбор * запросов не имеет смысла, когда доступен tabledata.list(). Я просто использовал этот запрос в качестве примера. Это действительно вопрос пропускной способности сети. В нашем примере, если JSON был сжат, это уменьшило бы количество данных, отправленных в 40 раз. –

+0

На самом деле я немного исследовал, и оказалось, что вы можете включить сжатие, передав заголовки Accept-Encoding и User-Agent (я добавил еще один ответ ниже с информацией и ссылкой на документацию). –

Смежные вопросы