Использование BigQuery с Python

1. Обзор

BigQuery — это полностью управляемое недорогое хранилище аналитических данных Google в петабайтном масштабе. BigQuery — это NoOps: здесь нет инфраструктуры, которой нужно управлять, и вам не нужен администратор базы данных, поэтому вы можете сосредоточиться на анализе данных, чтобы найти значимую информацию, использовать знакомый SQL и воспользоваться преимуществами нашей модели оплаты по мере использования.

В этой лаборатории кода вы будете использовать клиентские библиотеки Google Cloud для Python для запроса общедоступных наборов данных BigQuery с помощью Python.

Что вы узнаете

  • Как использовать Cloud Shell
  • Как включить API BigQuery
  • Как аутентифицировать запросы API
  • Как установить клиентскую библиотеку Python
  • Как запросить произведения Шекспира
  • Как запросить набор данных GitHub
  • Как настроить кеширование и отображение статистики

Что вам понадобится

  • Облачный проект Google
  • Браузер, например Chrome или Firefox.
  • Знакомство с использованием Python

Опрос

Как вы будете использовать этот урок?

Прочтите только до конца Прочитайте его и выполните упражнения.

Как бы вы оценили свой опыт работы с Python?

Новичок Средний Опытный

Как бы вы оценили свой опыт использования сервисов Google Cloud?

Новичок Средний Опытный

2. Настройка и требования

Самостоятельная настройка среды

  1. Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
  • Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как PROJECT_ID ), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта.
  • Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
  1. Далее вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .

Запустить Cloud Shell

Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.

Активировать Cloud Shell

  1. В Cloud Console нажмите «Активировать Cloud Shell». 853e55310c205094.png .

55efc1aaa7a4d3ad.png

Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:

9c92662c6a846a5c.png

Подготовка и подключение к Cloud Shell займет всего несколько минут.

9f0e51b578fecce5.png

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или Chromebook.

После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен идентификатор вашего проекта.

  1. Выполните следующую команду в Cloud Shell, чтобы подтвердить, что вы прошли аутентификацию:
gcloud auth list

Вывод команды

 Credentialed Accounts
ACTIVE  ACCOUNT
*       <my_account>@<my_domain.com>

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
  1. Выполните следующую команду в Cloud Shell, чтобы убедиться, что команда gcloud знает о вашем проекте:
gcloud config list project

Вывод команды

[core]
project = <PROJECT_ID>

Если это не так, вы можете установить это с помощью этой команды:

gcloud config set project <PROJECT_ID>

Вывод команды

Updated property [core/project].

3. Включите API

BigQuery API должен быть включен по умолчанию во всех проектах Google Cloud. Вы можете проверить, так ли это, с помощью следующей команды в Cloud Shell: Вы должны быть в списке BigQuery:

gcloud services list

Вы должны увидеть список BigQuery:

NAME                              TITLE
bigquery.googleapis.com           BigQuery API

...

Если BigQuery API не включен, вы можете использовать следующую команду в Cloud Shell, чтобы включить его:

gcloud services enable bigquery.googleapis.com

4. Аутентификация запросов API

Чтобы отправлять запросы к BigQuery API, вам необходимо использовать сервисный аккаунт . Сервисный аккаунт принадлежит вашему проекту и используется клиентской библиотекой Google Cloud Python для выполнения запросов API BigQuery. Как и любая другая учетная запись пользователя, учетная запись службы представлена ​​адресом электронной почты. В этом разделе вы будете использовать Cloud SDK для создания учетной записи службы, а затем создадите учетные данные, которые вам понадобятся для аутентификации в качестве учетной записи службы.

Сначала установите переменную среды PROJECT_ID :

export PROJECT_ID=$(gcloud config get-value core/project)

Затем создайте новую учетную запись службы для доступа к API BigQuery, используя:

gcloud iam service-accounts create my-bigquery-sa \
  --display-name "my bigquery service account"

Затем создайте учетные данные, которые ваш код Python будет использовать для входа в систему в качестве новой учетной записи службы. Создайте эти учетные данные и сохраните их как файл JSON ~/key.json с помощью следующей команды:

gcloud iam service-accounts keys create ~/key.json \
  --iam-account my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com

Наконец, установите переменную среды GOOGLE_APPLICATION_CREDENTIALS , которая используется клиентской библиотекой BigQuery Python, описанной на следующем шаге, для поиска ваших учетных данных. В переменной среды должен быть установлен полный путь к созданному вами JSON-файлу учетных данных, используя:

export GOOGLE_APPLICATION_CREDENTIALS=~/key.json

Подробнее об аутентификации BigQuery API можно прочитать здесь.

5. Настройте контроль доступа

BigQuery использует Identity and Access Management (IAM) для управления доступом к ресурсам. BigQuery имеет ряд предопределенных ролей (пользователь, владелец данных, просмотрщик данных и т. д.), которые вы можете назначить своему сервисному аккаунту, созданному на предыдущем шаге. Подробнее о контроле доступа можно прочитать в документации BigQuery.

Прежде чем вы сможете запрашивать общедоступные наборы данных, вам необходимо убедиться, что учетная запись службы имеет как минимум роль roles/bigquery.user . В Cloud Shell выполните следующую команду, чтобы назначить роль пользователя сервисному аккаунту:

gcloud projects add-iam-policy-binding ${PROJECT_ID} \
  --member "serviceAccount:my-bigquery-sa@${PROJECT_ID}.iam.gserviceaccount.com" \
  --role "roles/bigquery.user"

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

gcloud projects get-iam-policy $PROJECT_ID

Вы должны увидеть следующее:

bindings:
- members:
  - serviceAccount:my-bigquery-sa@<PROJECT_ID>.iam.gserviceaccount.com
  role: roles/bigquery.user
...

6. Установите клиентскую библиотеку.

Установите клиентскую библиотеку BigQuery Python:

pip3 install --user --upgrade google-cloud-bigquery

Теперь вы готовы писать код с помощью BigQuery API!

7. Запросите произведения Шекспира.

Публичный набор данных – это любой набор данных, хранящийся в BigQuery и доступный для широкой публики. Существует множество других общедоступных наборов данных, которые вы можете запросить. Хотя некоторые наборы данных размещаются в Google, большинство из них размещаются у третьих лиц. Дополнительную информацию см. на странице «Общедоступные наборы данных» .

Помимо общедоступных наборов данных, BigQuery предоставляет ограниченное количество примеров таблиц , к которым вы можете запрашивать. Эти таблицы содержатся в наборе bigquery-public-data:samples . Таблица shakespeare в наборе данных samples содержит словесный указатель произведений Шекспира. Он показывает, сколько раз каждое слово встречается в каждом корпусе.

На этом этапе вы запросите таблицу shakespeare .

Сначала в Cloud Shell создайте простое приложение Python, которое вы будете использовать для запуска примеров API перевода.

mkdir bigquery-demo
cd bigquery-demo
touch app.py

Откройте редактор кода в правом верхнем углу Cloud Shell:

b648141af44811a3.png

Перейдите к файлу app.py в папке bigquery-demo и замените код следующим.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT corpus AS title, COUNT(word) AS unique_words
    FROM `bigquery-public-data.samples.shakespeare`
    GROUP BY title
    ORDER BY unique_words
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    title = row['title']
    unique_words = row['unique_words']
    print(f'{title:<20} | {unique_words}')

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

Вернувшись в Cloud Shell, запустите приложение:

python3 app.py

Вы должны увидеть список слов и их вхождение:

hamlet               | 5318
kinghenryv           | 5104
cymbeline            | 4875
troilusandcressida   | 4795
kinglear             | 4784
kingrichardiii       | 4713
2kinghenryvi         | 4683
coriolanus           | 4653
2kinghenryiv         | 4605
antonyandcleopatra   | 4582

8. Запросите набор данных GitHub.

Чтобы лучше познакомиться с BigQuery, вы выполните запрос к общедоступному набору данных GitHub . Наиболее распространенные сообщения о коммитах вы найдете на GitHub. Вы также будете использовать веб-консоль BigQuery для предварительного просмотра и выполнения специальных запросов.

Чтобы увидеть, как выглядят данные, откройте набор данных GitHub в веб-интерфейсе BigQuery:

Откройте таблицу github_repos

Нажмите кнопку «Предварительный просмотр», чтобы увидеть, как выглядят данные:

d3f0dc7400fbe678.png

Перейдите к файлу app.py в папке bigquery_demo и замените код следующим.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
results = client.query(query)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

Уделите минуту или две, чтобы изучить код и посмотреть, как к таблице запрашиваются наиболее распространенные сообщения о фиксации.

Вернувшись в Cloud Shell, запустите приложение:

python3 app.py

Вы должны увидеть список сообщений о фиксации и их появление:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862

9. Кэширование и статистика

BigQuery кэширует результаты запросов. В результате последующие запросы занимают меньше времени. Кеширование можно отключить с помощью параметров запроса. BigQuery также отслеживает статистику запросов, такую ​​как время создания, время окончания, общее количество обработанных байтов.

На этом этапе вы отключите кеширование, а также отобразите статистику по запросам.

Перейдите к файлу app.py в папке bigquery_demo и замените код следующим.

from google.cloud import bigquery

client = bigquery.Client()

query = """
    SELECT subject AS subject, COUNT(*) AS num_duplicates
    FROM bigquery-public-data.github_repos.commits
    GROUP BY subject
    ORDER BY num_duplicates
    DESC LIMIT 10
"""
job_config = bigquery.job.QueryJobConfig(use_query_cache=False)
results = client.query(query, job_config=job_config)

for row in results:
    subject = row['subject']
    num_duplicates = row['num_duplicates']
    print(f'{subject:<20} | {num_duplicates:>9,}')

print('-'*60)
print(f'Created: {results.created}')
print(f'Ended:   {results.ended}')
print(f'Bytes:   {results.total_bytes_processed:,}')

Несколько замечаний по поводу кода. Во-первых, кеширование отключается путем введения QueryJobConfig и установки use_query_cache значения false. Во-вторых, вы получили доступ к статистике запроса из объекта задания.

Вернувшись в Cloud Shell, запустите приложение:

python3 app.py

Как и прежде, вы должны увидеть список сообщений о фиксации и их появление. Кроме того, в конце вы также должны увидеть некоторую статистику по запросу:

Update README.md     | 1,685,515
Initial commit       | 1,577,543
update               |   211,017
                     |   155,280
Create README.md     |   153,711
Add files via upload |   152,354
initial commit       |   145,224
first commit         |   110,314
Update index.html    |    91,893
Update README        |    88,862
------------------------------------------------------------
Created: 2020-04-03 13:30:08.801000+00:00
Ended:   2020-04-03 13:30:15.334000+00:00
Bytes:   2,868,251,894

10. Загрузка данных в BigQuery

Если вы хотите запросить собственные данные, вам необходимо загрузить их в BigQuery. BigQuery поддерживает загрузку данных из многих источников, включая Cloud Storage, другие сервисы Google и другие читаемые источники. Вы даже можете осуществлять потоковую передачу данных с помощью потоковых вставок. Дополнительную информацию см. на странице Загрузка данных в BigQuery .

На этом этапе вы загрузите файл JSON, хранящийся в Cloud Storage, в таблицу BigQuery. Файл JSON находится по gs://cloud-samples-data/bigquery/us-states/us-states.json

Если вам интересно узнать содержимое файла JSON, вы можете использовать инструмент командной строки gsutil , чтобы загрузить его в Cloud Shell:

gsutil cp gs://cloud-samples-data/bigquery/us-states/us-states.json .

Вы можете видеть, что он содержит список штатов США, и каждый штат представляет собой документ JSON в отдельной строке:

head us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr":  "AK"}
...

Чтобы загрузить этот файл JSON в BigQuery, перейдите к файлу app.py в папке bigquery_demo и замените код следующим.

from google.cloud import bigquery

client = bigquery.Client()

gcs_uri = 'gs://cloud-samples-data/bigquery/us-states/us-states.json'

dataset = client.create_dataset('us_states_dataset')
table = dataset.table('us_states_table')

job_config = bigquery.job.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING'),
]
job_config.source_format = bigquery.SourceFormat.NEWLINE_DELIMITED_JSON

load_job = client.load_table_from_uri(gcs_uri, table, job_config=job_config)

print('JSON file loaded to BigQuery')

Уделите минуту-две, чтобы изучить, как код загружает файл JSON и создает таблицу со схемой в наборе данных.

Вернувшись в Cloud Shell, запустите приложение:

python3 app.py

В BigQuery создаются набор данных и таблица.

Чтобы убедиться, что набор данных создан, зайдите в консоль BigQuery . Вы должны увидеть новый набор данных и таблицу. Перейдите на вкладку предварительного просмотра таблицы, чтобы увидеть свои данные:

8c7d2621820a5ac4.png

11. Поздравляем!

Вы узнали, как использовать BigQuery с Python!

Очистить

Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве:

  • В Cloud Console перейдите на страницу «Управление ресурсами» .
  • В списке проектов выберите свой проект и нажмите «Удалить» .
  • В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу» , чтобы удалить проект.

Узнать больше

Лицензия

Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.