1. Обзор
BigQuery — это полностью управляемое недорогое хранилище аналитических данных Google в петабайтном масштабе. BigQuery — это NoOps: здесь нет инфраструктуры, которой нужно управлять, и вам не нужен администратор базы данных, поэтому вы можете сосредоточиться на анализе данных, чтобы найти значимую информацию, использовать знакомый SQL и воспользоваться преимуществами нашей модели оплаты по мере использования.
В этой лаборатории кода вы будете использовать клиентские библиотеки Google Cloud для Python для запроса общедоступных наборов данных BigQuery с помощью Python.
Что вы узнаете
- Как использовать Cloud Shell
- Как включить API BigQuery
- Как аутентифицировать запросы API
- Как установить клиентскую библиотеку Python
- Как запросить произведения Шекспира
- Как запросить набор данных GitHub
- Как настроить кеширование и отображение статистики
Что вам понадобится
Опрос
Как вы будете использовать этот урок?
Как бы вы оценили свой опыт работы с Python?
Как бы вы оценили свой опыт использования сервисов Google Cloud?
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Google Cloud Console и создайте новый проект или повторно используйте существующий. Если у вас еще нет учетной записи Gmail или Google Workspace, вам необходимо ее создать .
- Имя проекта — это отображаемое имя для участников этого проекта. Это строка символов, не используемая API Google, и вы можете обновить ее в любое время.
- Идентификатор проекта должен быть уникальным для всех проектов Google Cloud и неизменяемым (нельзя изменить после его установки). Cloud Console автоматически генерирует уникальную строку; обычно тебя не волнует, что это такое. В большинстве лабораторий кода вам потребуется указать идентификатор проекта (обычно он обозначается как
PROJECT_ID
), поэтому, если он вам не нравится, создайте другой случайный идентификатор или попробуйте свой собственный и посмотрите, доступен ли он. Затем он «замораживается» после создания проекта. - Существует третье значение — номер проекта , который используют некоторые API. Подробнее обо всех трех этих значениях читайте в документации .
- Далее вам необходимо включить выставление счетов в Cloud Console, чтобы использовать облачные ресурсы/API. Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Чтобы отключить ресурсы и не платить за выставление счетов за пределами этого руководства, следуйте инструкциям по «очистке», которые можно найти в конце лаборатории кода. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя Google Cloud можно управлять удаленно с вашего ноутбука, в этой лаборатории вы будете использовать Google Cloud Shell , среду командной строки, работающую в облаке.
Активировать Cloud Shell
- В Cloud Console нажмите «Активировать Cloud Shell». .
Если вы никогда раньше не запускали Cloud Shell, вам будет представлен промежуточный экран (ниже сгиба) с описанием того, что это такое. В этом случае нажмите «Продолжить» (и вы больше никогда этого не увидите). Вот как выглядит этот одноразовый экран:
Подготовка и подключение к Cloud Shell займет всего несколько минут.
Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 5 ГБ и работает в Google Cloud, что значительно повышает производительность сети и аутентификацию. Большую часть, если не всю, работу в этой лаборатории кода можно выполнить с помощью просто браузера или Chromebook.
После подключения к Cloud Shell вы увидите, что вы уже прошли аутентификацию и что для проекта уже установлен идентификатор вашего проекта.
- Выполните следующую команду в 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`
- Выполните следующую команду в 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:
Перейдите к файлу 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:
Нажмите кнопку «Предварительный просмотр», чтобы увидеть, как выглядят данные:
Перейдите к файлу 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 . Вы должны увидеть новый набор данных и таблицу. Перейдите на вкладку предварительного просмотра таблицы, чтобы увидеть свои данные:
11. Поздравляем!
Вы узнали, как использовать BigQuery с Python!
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud за ресурсы, используемые в этом руководстве:
- В Cloud Console перейдите на страницу «Управление ресурсами» .
- В списке проектов выберите свой проект и нажмите «Удалить» .
- В диалоговом окне введите идентификатор проекта и нажмите «Завершить работу» , чтобы удалить проект.
Узнать больше
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Python в Google Cloud: https://cloud.google.com/python/
- Облачные клиентские библиотеки для Python: https://googleapis.github.io/google-cloud-python/
Лицензия
Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.