Статьи

Введение в Google BigQuery

На этот раз я пишу о 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, вот ссылка для начала.