На этот раз я пишу о Google BigQuery, сервисе, который Google сделал общедоступным в мае 2012 года . Это было какое-то время, какой-то блог Google Research говорил об этом в 2010 году, затем Google объявил ограниченный предварительный просмотр в ноябре 2011 года, и в конце концов он был запущен в этом месяце.
Технология основана на Dremel , а не MapReduce. Причина наличия альтернативы MapReduce описана в документе Dremel: « Dremel может выполнять множество запросов к таким данным, которые обычно требуют последовательности заданий MapReduce…, но за небольшую часть времени выполнения. Dremel не предназначен для замены MR и часто используется вместе с ним для анализа результатов MR-конвейеров или быстрого прототипирования больших вычислений ».
Так что же такое BigQuery? Как ответил на Google BigQuery сайте: « Google BigQuery это веб — сервис , который позволяет сделать интерактивный анализ массивных наборов данных, чтобы миллиарды строк.»
Начало работы с BigQuery
Чтобы иметь возможность использовать BigQuery, сначала нужно зарегистрироваться на нем через консоль Google API . Как только это будет сделано, вы можете начать пользоваться сервисом. Самый простой способ начать с BigQuery Browser Tool.
BigQuery Browser Tool
При первом входе в BigQuery Browser Tool вы увидите следующее приветственное сообщение:
Уже есть общедоступный набор данных, так что вы можете быстро осмотреться и узнать, как использовать BigQuery Browser Tool. Например, вот схема таблицы github_timeline, моментального магазина из архива GitHub:
Вы можете выполнить простой запрос с помощью COMPOSE QUERY из инструмента браузера, синтаксис SQL-подобен:
ВЫБЕРИТЕ имя репозитория, имя репозитория, описание репозитория ОТ открытых данных: samples.github_timeline LIMIT 1000;
Пока все хорошо … Давайте теперь создадим наши собственные таблицы. Набор данных, который я использовал, взят из каталога данных WorldBank, и это данные по ВВП и населению для стран всего мира. Они доступны в формате CSV (а также в Excel и PDF).
В качестве первого шага нам нужно создать набор данных — набор данных в основном представляет собой одну или несколько таблиц в BigQuery. Вам нужно щелкнуть значок стрелки вниз рядом с проектом API и выбрать «Создать новый набор данных».
Затем вам нужно создать таблицу. Нажмите на стрелку вниз для набора данных ( в нашем случае Worldbank ) и выберите «Создать новую таблицу»
Затем вам нужно определить параметры таблицы, такие как имя, схема и исходный файл для загрузки. Примечание. Похоже, что Internet Explorer 8 не поддерживает загрузку файлов CSV («Ссылка на загрузку файлов в настоящее время не поддерживается в вашем браузере.» Для ссылки «Загрузка файлов» появляется сообщение). Вам лучше использовать Chrome, который поддерживает загрузку файлов CSV.
Когда вы загружаете файл, вам необходимо указать схему в следующем формате: county_code: строка, рейтинг: целое число, country_name: строка, значение: целое число
Также доступны расширенные опции: вы можете использовать, например, файлы, разделенные табуляцией, вместо файлов, разделенных запятыми, вы можете определить, сколько недопустимых строк будет принято, сколько строк пропущено и т. Д.
Во время загрузки данные проверяются по указанной схеме, если они нарушены, вы получите сообщения об ошибках в истории заданий. (например, «Слишком много столбцов: ожидается 4 столбца (ов), но получено 5 столбцов)»
После успешного завершения загрузки вы готовы выполнить запросы к данным. Для этого вы можете использовать COMPOSE QUERY, как мы уже описали для таблицы github_timeline. Чтобы отобразить ТОП 10 стран с самыми высокими значениями ВВП, выполните следующий запрос:
ВЫБЕРИТЕ имя страны, значение ОТ worldbank.gdp ПОРЯДОК ПО значению DESC LIMIT 10
Инструмент командной строки BigQuery
Это было легко, но мы ребята из софта, не так ли? Нам нужна командная строка, а не только браузерная функциональность! Расслабьтесь, есть инструмент командной строки BigQuery , написанный на python.
Вы можете скачать его отсюда и установить, разархивировав файл.
Чтобы установить его, вы просто запускаете: python setup.py install
Я использовал инструмент командной строки BigQuery на компьютере с Windows 7, в Linux он очень похож, за исключением того, что учетные данные хранятся на вашем локальном компьютере. (это может быть ~ / .bigquery.v2.token и ~ / .bigqueryrc в случае Linux и% USERPROFILE% \. bigquery.v2.token и% USRPROFILE% \. bigqueryrc в случае Windows).
Когда вы запускаете его в первый раз, он должен быть аутентифицирован через OAuth2.
C:\BigQuery\bigquery-2.0.4>python bq.py shell ****************************************************************** ** No OAuth2 credentials found, beginning authorization process ** ****************************************************************** Go to the following link in your browser: https://accounts.google.com/o/oauth2/auth?scope=https%3A%2F%2Fwww.googleapis .com%2Fauth%2Fbigquery&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&response _type=code&client_id=123456789.apps.googleusercontent.com&access_type=offline Enter verification code: ********* Authentication successful. ************************************************ ** Continuing execution of BigQuery operation ** ************************************************ Welcome to BigQuery! (Type help for more information.) BigQuery> ls projectId friendlyName -------------- -------------- 190120083879 API Project BigQuery> exit
Поэтому в первый раз вам нужно перейти по указанному URL-адресу с помощью браузера, использовать инструмент «Разрешить доступ к BigQuery» и скопировать и вставить сгенерированный код подтверждения при появлении запроса «Введите код подтверждения». Затем он будет сохранен на вашем локальном компьютере, как указано выше, и вам не нужно будет разрешать доступ с этого момента. (если вы не хотите инициализировать весь процесс доступа)
Таким образом, при второй попытке запустить оболочку BigQuery все пройдет без ошибок:
C:\BigQuery\bigquery-2.0.4>python bq.py shell Welcome to BigQuery! (Type help for more information.) BigQuery> ls projectId friendlyName -------------- -------------- 190120083879 API Project BigQuery> ls 190120083879 datasetId ----------- worldbank BigQuery> exit Goodbye.
Чтобы проверить схему для таблиц ВВП и населения (таблица народонаселения имеет ту же схему, что и ВВП, а также была загружена так же, как ВВП — с помощью инструмента BigQuery Browser):
C:\BigQuery\bigquery-2.0.4>python bq.py show 190120083879:worldbank.gdp Table 190120083879:worldbank.gdp Last modified Schema Total Rows Total Bytes ----------------- ------------------------- ------------ ------------- 13 May 12:10:33 |- county_code: string 195 6265 |- ranking: integer |- country_name: string |- value: integer C:\BigQuery\bigquery-2.0.4>python bq.py show 190120083879:worldbank.population Table 190120083879:worldbank.population Last modified Schema Total Rows Total Bytes ----------------- ------------------------- ------------ ------------- 13 May 12:14:02 |- county_code: string 215 7007 |- ranking: integer |- country_name: string |- value: integer
Чтобы проверить первые 10 строк в таблице заполнения (вы можете заметить, что значения упорядочены, это потому, что значения уже упорядочены в CSV-файле WorldBank):
C:\BigQuery\bigquery-2.0.4>python bq.py head -n 10 190120083879:worldbank.popula tion +-------------+---------+--------------------+---------+ | county_code | ranking | country_name | value | +-------------+---------+--------------------+---------+ | CHN | 1 | China | 1338300 | | IND | 2 | India | 1224615 | | USA | 3 | United States | 309349 | | IDN | 4 | Indonesia | 239870 | | BRA | 5 | Brazil | 194946 | | PAK | 6 | Pakistan | 173593 | | NGA | 7 | Nigeria | 158423 | | BGD | 8 | Bangladesh | 148692 | | RUS | 9 | Russian Federation | 141750 | | JPN | 10 | Japan | 127451 | +-------------+---------+--------------------+---------+
Чтобы выполнить запрос SELECT к таблице, сначала нужно инициализировать проект, поэтому необходимо правильно настроить .bigqueryrc:
C:\Users\istvan>type .bigqueryrc project_id = 190120083879 credential_file = c:\Users\istvan\.bigquery.v2.token dataset_id = worldbank C:\Users\istvan>
Тогда вы можете запустить:
C:\BigQuery\bigquery-2.0.4>python bq.py query "SELECT country_name, value FROM w orldbank.gdp ORDER BY value DESC LIMIT 10" Waiting on job_5745d8eb41cf489fbf6ffb7a3bc3487e ... (0s) Current status: RUNNING Waiting on job_5745d8eb41cf489fbf6ffb7a3bc3487e ... (0s) Current status: DONE +----------------+----------+ | country_name | value | +----------------+----------+ | United States | 14586736 | | China | 5926612 | | Japan | 5458837 | | Germany | 3280530 | | France | 2560002 | | United Kingdom | 2261713 | | Brazil | 2087890 | | Italy | 2060965 | | India | 1727111 | | Canada | 1577040 | +----------------+----------+
BigQuery API
Инструмент браузера BigQuery и инструмент командной строки могут подойти в большинстве случаев. но, черт возьми, разве мы не более крепкие парни — мастера API? Если да, Google BigQuery также может предложить API и клиентские библиотеки BigQuery . Это могут быть Python, Java, .NET, PHP, Ruby, Objective-C и т. Д. И т. Д.
Вот приложение Python, которое выполняет тот же запрос SELECT, который мы использовали из инструмента браузера и командной строки:
import httplib2 import sys import pprint from apiclient.discovery import build from apiclient.errors import HttpError from oauth2client.client import AccessTokenRefreshError from oauth2client.client import OAuth2WebServerFlow from oauth2client.file import Storage from oauth2client.tools import run FLOW = OAuth2WebServerFlow( client_id='123456789.apps.googleusercontent.com', client_secret='*************', scope='https://www.googleapis.com/auth/bigquery', user_agent='bq/2.0') # Run a synchronous query def runSyncQuery (service, projectId, datasetId, timeout=0): try: print 'timeout:%d' % timeout jobCollection = service.jobs() queryData = {'query':'SELECT country_name, value FROM worldbank.gdp ORDER BY value DESC LIMIT 10;', 'timeoutMs':timeout} queryReply = jobCollection.query(projectId=projectId, body=queryData).execute() jobReference=queryReply['jobReference'] # Timeout exceeded: keep polling until the job is complete. while(not queryReply['jobComplete']): print 'Job not yet complete...' queryReply = jobCollection.getQueryResults( projectId=jobReference['projectId'], jobId=jobReference['jobId'], timeoutMs=timeout).execute() pprint.pprint(queryReply) except AccessTokenRefreshError: print ("The credentials have been revoked or expired, please re-run" "the application to re-authorize") except HttpError as err: print 'Error in runSyncQuery:', pprint.pprint(err.content) except Exception as err: print 'Undefined error' % err def main(): # If the credentials don't exist or are invalid, run the native client # auth flow. The Storage object will ensure that if successful the good # credentials will get written back to a file. storage = Storage('c:\Users\istvan\.bigquery.v2.token') # Choose a file name to store the credentials. credentials = storage.get() if credentials is None or credentials.invalid: credentials = run(FLOW, storage) # Create an httplib2.Http object to handle our HTTP requests and authorize it # with our good credentials. http = httplib2.Http() http = credentials.authorize(http) service = build("bigquery", "v2", http=http) # Now make calls print 'Make call' runSyncQuery(service, projectId='190120083879', datasetId='worldbank') if __name__ == '__main__': main(
Вывод будет выглядеть так:
C:\BigQuery\PythonClient>python bq_client.py Make call timeout:0 Job not yet complete... Job not yet complete... Job not yet complete... {u'etag': u'"6wEDxP58PwCUv91kOlRB8L7rm_A/69KAOvEhHO4pBtqit7nlzybfIPc"', u'jobComplete': True, u'jobReference': {u'jobId': u'job_9a1c0d2bcf9443b18e2204d1f4db476a', u'projectId': u'190120083879'}, u'kind': u'bigquery#getQueryResultsResponse', u'rows': [{u'f': [{u'v': u'United States'}, {u'v': u'14586736'}]}, {u'f': [{u'v': u'China'}, {u'v': u'5926612'}]}, {u'f': [{u'v': u'Japan'}, {u'v': u'5458837'}]}, {u'f': [{u'v': u'Germany'}, {u'v': u'3280530'}]}, {u'f': [{u'v': u'France'}, {u'v': u'2560002'}]}, {u'f': [{u'v': u'United Kingdom'}, {u'v': u'2261713'}]}, {u'f': [{u'v': u'Brazil'}, {u'v': u'2087890'}]}, {u'f': [{u'v': u'Italy'}, {u'v': u'2060965'}]}, {u'f': [{u'v': u'India'}, {u'v': u'1727111'}]}, {u'f': [{u'v': u'Canada'}, {u'v': u'1577040'}]}], u'schema': {u'fields': [{u'mode': u'NULLABLE', u'name': u'country_name', u'type': u'STRING'}, {u'mode': u'NULLABLE', u'name': u'value', u'type': u'INTEGER'}]}, u'totalRows': u'10'} C:\BigQuery\PythonClient>
Если вы хотите вникнуть в BigQuery API, вот ссылка для начала.