2016-01-23 1 views
0

Я знаю, что есть способ поместить результаты запроса в таблицу; есть способ скопировать всю таблицу в другую таблицу; и есть способ перечислить таблицу по частям (tabledata: list, используя startIndex, maxResults и pageToken).BigQuery tabledata: вывод списка в таблицу bigquery

Однако, что я хочу сделать, это переместить существующую таблицу с помощью tabledata: list и вывести результаты по частям в другие таблицы. Я хочу использовать это как эффективный способ очертить таблицу.

Я не могу найти ссылку на такую ​​функциональность или любое обходное решение для нее.

ответ

0

Важно осознать: Tabledata.List API не является частью BQL (BigQuery SQL), а BigQuery API, что вы можете использовать в client вашего выбора. Тем не менее, логика вы изложенная в вашем вопросе может быть реализована во многих отношениях, ниже приведен пример (этапы высокого уровня):

Вызова Tabledata.List внутри цикла с использованием pageToken для следующей итерации или для выхода из цикла. На каждой итерации отклик процесса от Tabledata.List, извлекать фактические данные и вставлять в таблицу назначения с использованием streaming data с Tabledata.InsertAll API. Вы также можете иметь внутренний цикл, чтобы пройти через строки, извлеченные в данной итерации, и определить, какой из них следует переходить в таблицу/осколок. Это очень общая логика, и конкретная реализация зависит от используемого вами клиента. Надеюсь, что это помогает

+0

Это значит, что данные загружаются локально (снаружи BQ), а затем отправляются обратно в BQ. Я знаю, как это сделать, и мне не нужно использовать InsertAll (что довольно дорого), но может использовать простое задание вставки. Вопрос в том, могу ли я сделать это в BQ, не возвращаясь снова? Может быть, с объединенными таблицами, использующими Google Cloud? – user3688176

+0

Важно: «Первое, что вам нужно сделать после прочтения чей-то ответ на ваш вопрос, - это голосовать за ответ, как и любой другой пользователь (с достаточной репутацией). Голосовые ответы, которые полезны', и примите ответ, который вы считаете наиболее полезным для вас. Есть еще ... Вы можете проверить, что делать, когда кто-то отвечает на ваш вопрос - http://stackoverflow.com/help/someone-answers и http://meta.stackexchange.com/questions/5234/how-does -захват-ответ-работа # 5235 –

0

За то, что вы описали, я предлагаю вам использовать пакетную версию Cloud DataFlow:

https://cloud.google.com/dataflow/

Dataflow уже поддерживает таблицы BigQuery в качестве источников и поглотителей, и будет хранить все данные в сети Google. Этот подход также масштабируется до сколь угодно больших таблиц.

TableData.list-таблица всей таблицы может отлично работать для небольших таблиц, но в стороне от сети, она определенно не рекомендуется ни для чего умеренного размера.

+0

Спасибо, Шон. Поэтому, если я правильно понимаю: а) мы должны выйти за пределы BQ, чтобы сделать это эффективно. b) Поток данных по существу является способом использования облачного хранилища и вычислительного механизма (поэтому теоретически можно программно вызывать эти два вместо использования Dataflow). Верный? Теперь у Dataflow есть Restful API, или нам нужно использовать Java для работы над ним? Это слишком усложняло бы ... – user3688176

+0

Для того, что вы описываете, поток облачных данных кажется наиболее эффективным средством. Они обеспечивают логику клея и оркестровки для обработки таблицы BigQuery параллельно и записывают результаты в одну или несколько выходных таблиц. Вы определенно можете сделать это непосредственно, взаимодействуя с GCE, GCS и BigQuery, но я думаю, вы найдете это довольно сложным. W.r.t. API потока данных, поскольку он запускает ваш Java-код, вам нужно взаимодействовать с java API для аспектов параллельной обработки.Тем не менее, я считаю, что есть успокоительные API управления для запуска выполнения и т. Д. –