1. Обзор
BigQuery — это полностью управляемое недорогое хранилище аналитических данных Google в петабайтном масштабе. BigQuery — это NoOps: здесь нет инфраструктуры, которой нужно управлять, и вам не нужен администратор базы данных, поэтому вы можете сосредоточиться на анализе данных, чтобы найти значимую информацию, использовать знакомый SQL и воспользоваться преимуществами нашей модели оплаты по мере использования.
В этой лаборатории кода вы будете использовать клиентскую библиотеку Google Cloud BigQuery для запроса общедоступных наборов данных BigQuery с помощью Node.js.
Что вы узнаете
- Как использовать Cloud Shell
- Как включить API BigQuery
- Как аутентифицировать запросы API
- Как установить клиентскую библиотеку BigQuery для Node.js
- Как запросить произведения Шекспира
- Как запросить набор данных GitHub
- Как настроить кеширование и отображение статистики
Что вам понадобится
- Проект облачной платформы Google
- Браузер, например Chrome или Firefox.
- Знакомство с использованием Node.js
Опрос
Как вы будете использовать этот урок?
Как бы вы оценили свой опыт работы с Node.js?
Как бы вы оценили свой опыт использования сервисов Google Cloud Platform?
2. Настройка и требования
Самостоятельная настройка среды
- Войдите в Cloud Console и создайте новый проект или повторно используйте существующий. (Если у вас еще нет учетной записи Gmail или G Suite, вам необходимо ее создать .)
Запомните идентификатор проекта — уникальное имя для всех проектов Google Cloud (имя, указанное выше, уже занято и не подойдет вам, извините!). Позже в этой лаборатории он будет называться PROJECT_ID
.
- Далее вам необходимо включить биллинг в Cloud Console, чтобы использовать ресурсы Google Cloud.
Прохождение этой лаборатории кода не должно стоить много, если вообще стоит. Обязательно следуйте всем инструкциям в разделе «Очистка», в которых рассказывается, как отключить ресурсы, чтобы не взимать плату за пределами этого руководства. Новые пользователи Google Cloud имеют право на участие в программе бесплатной пробной версии стоимостью 300 долларов США .
Запустить Cloud Shell
Хотя инструментом командной строки Cloud SDK можно управлять удаленно с вашего ноутбука, в этой лаборатории кода вы будете использовать 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`
gcloud config list project
Вывод команды
[core] project = <PROJECT_ID>
Если это не так, вы можете установить это с помощью этой команды:
gcloud config set project <PROJECT_ID>
Вывод команды
Updated property [core/project].
3. Включите API BigQuery.
BigQuery API должен быть включен по умолчанию во всех проектах Google Cloud. Вы можете проверить, так ли это, с помощью следующей команды в Cloud Shell:
gcloud services list
Вы должны увидеть список BigQuery:
NAME TITLE
bigquery-json.googleapis.com BigQuery API
...
Если BigQuery API не включен, вы можете использовать следующую команду в Cloud Shell, чтобы включить его:
gcloud services enable bigquery-json.googleapis.com
4. Аутентификация запросов API
Чтобы отправлять запросы к BigQuery API, вам необходимо использовать сервисный аккаунт . Сервисный аккаунт принадлежит вашему проекту и используется клиентской библиотекой Google BigQuery Node.js для выполнения запросов BigQuery API. Как и любая другая учетная запись пользователя, учетная запись службы представлена адресом электронной почты. В этом разделе вы будете использовать Cloud SDK для создания учетной записи службы, а затем создадите учетные данные, которые вам понадобятся для аутентификации в качестве учетной записи службы.
Сначала установите переменную среды с вашим PROJECT_ID, которую вы будете использовать в этой лаборатории кода:
export GOOGLE_CLOUD_PROJECT=$(gcloud config get-value core/project)
Затем создайте новую учетную запись службы для доступа к API BigQuery, используя:
gcloud iam service-accounts create my-bigquery-sa --display-name "my bigquery codelab service account"
Затем создайте учетные данные, которые ваш код Node.js будет использовать для входа в систему в качестве новой учетной записи службы. Создайте эти учетные данные и сохраните их как файл JSON « ~/key.json » с помощью следующей команды:
gcloud iam service-accounts keys create ~/key.json --iam-account my-bigquery-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com
Наконец, установите переменную среды GOOGLE_APPLICATION_CREDENTIALS , которая используется библиотекой BigQuery API C#, описанной на следующем шаге, чтобы найти ваши учетные данные. В переменной среды должен быть указан полный путь к созданному вами JSON-файлу учетных данных. Установите переменную среды с помощью следующей команды:
export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"
Подробнее об аутентификации BigQuery API можно прочитать здесь.
5. Настройка контроля доступа
BigQuery использует Identity and Access Management (IAM) для управления доступом к ресурсам. BigQuery имеет ряд предопределенных ролей (пользователь, владелец данных, просмотрщик данных и т. д.), которые вы можете назначить своему сервисному аккаунту, созданному на предыдущем шаге. Подробнее о контроле доступа можно прочитать в документации BigQuery.
Прежде чем вы сможете запрашивать общедоступные наборы данных, вам необходимо убедиться, что учетная запись службы имеет как минимум роль bigquery.user . В Cloud Shell выполните следующую команду, чтобы назначить роль bigquery.user сервисному аккаунту:
gcloud projects add-iam-policy-binding ${GOOGLE_CLOUD_PROJECT} --member "serviceAccount:my-bigquery-sa@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" --role "roles/bigquery.user"
Вы можете запустить следующую команду, чтобы убедиться, что учетной записи службы назначена роль пользователя:
gcloud projects get-iam-policy $GOOGLE_CLOUD_PROJECT
6. Установите клиентскую библиотеку BigQuery для Node.js.
Сначала создайте папку BigQueryDemo
и перейдите к ней:
mkdir BigQueryDemo
cd BigQueryDemo
Затем создайте проект Node.js, который вы будете использовать для запуска примеров клиентской библиотеки BigQuery:
npm init -y
Вы должны увидеть созданный проект Node.js:
{
"name": "BigQueryDemo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC"
}
Установите клиентскую библиотеку BigQuery:
npm install --save @google-cloud/bigquery
npm notice created a lockfile as package-lock.json. You should commit this file.
npm WARN BigQueryDemo@1.0.0 No description
npm WARN BigQueryDemo@1.0.0 No repository field.
+ @google-cloud/bigquery@2.1.0
added 69 packages from 105 contributors and audited 147 packages in 4.679s
found 0 vulnerabilities
Теперь вы готовы использовать клиентскую библиотеку BigQuery Node.js!
7. Запросите произведения Шекспира.
Публичный набор данных — это любой набор данных, который хранится в BigQuery и доступен для широкой публики. Существует множество других общедоступных наборов данных, доступных для запроса, некоторые из которых также размещаются в Google, но многие другие размещаются у третьих сторон. Подробнее можно прочитать на странице «Общедоступные наборы данных» .
Помимо общедоступных наборов данных, BigQuery предоставляет ограниченное количество образцов таблиц , к которым вы можете запрашивать. Эти таблицы содержатся в bigquery-public-data:samples dataset
. Одна из этих таблиц называется shakespeare.
Он содержит словарный указатель произведений Шекспира, показывающий, сколько раз каждое слово встречается в каждом корпусе.
На этом этапе вы запросите таблицу Шекспира.
Сначала откройте редактор кода в правом верхнем углу Cloud Shell:
Создайте файл queryShakespeare.js
в папке BigQueryDemo
:
touch queryShakespeare.js
Перейдите к файлу queryShakespeare.js
и вставьте следующий код:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryShakespeare() {
// Queries a public Shakespeare dataset.
// Create a client
const bigqueryClient = new BigQuery();
// The SQL query to run
const sqlQuery = `SELECT word, word_count
FROM \`bigquery-public-data.samples.shakespeare\`
WHERE corpus = @corpus
AND word_count >= @min_word_count
ORDER BY word_count DESC`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
params: {corpus: 'romeoandjuliet', min_word_count: 250},
};
// Run the query
const [rows] = await bigqueryClient.query(options);
console.log('Rows:');
rows.forEach(row => console.log(row));
}
queryShakespeare();
}
main();
Уделите минуту или две, чтобы изучить код и посмотреть, как запрашивается таблица.
Вернувшись в Cloud Shell, запустите приложение:
node queryShakespeare.js
Вы должны увидеть список слов и их вхождение:
Rows:
{ word: 'the', word_count: 614 }
{ word: 'I', word_count: 577 }
{ word: 'and', word_count: 490 }
{ word: 'to', word_count: 486 }
{ word: 'a', word_count: 407 }
{ word: 'of', word_count: 367 }
{ word: 'my', word_count: 314 }
{ word: 'is', word_count: 307 }
...
8. Запросите набор данных GitHub.
Чтобы лучше познакомиться с BigQuery, вы выполните запрос к общедоступному набору данных GitHub . Наиболее распространенные сообщения о коммитах вы найдете на GitHub. Вы также будете использовать веб-интерфейс BigQuery для предварительного просмотра и выполнения специальных запросов.
Чтобы просмотреть данные, откройте набор данных GitHub в веб-интерфейсе BigQuery:
https://console.cloud.google.com/bigquery?p=bigquery-public-data&d=github_repos&t=commits&page=table
Чтобы быстро просмотреть, как выглядят данные, перейдите на вкладку «Предварительный просмотр»:
Создайте файл queryGitHub.js
в папке BigQueryDemo
:
touch queryGitHub.js
Перейдите к файлу queryGitHub.js
и вставьте следующий код:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryGitHub() {
// Queries a public GitHub dataset.
// Create a client
const bigqueryClient = new BigQuery();
// The SQL query to run
const sqlQuery = `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`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
};
// Run the query
const [rows] = await bigqueryClient.query(options);
console.log('Rows:');
rows.forEach(row => console.log(`${row.subject}: ${row.num_duplicates}`));
}
queryGitHub();
}
main();
Уделите минуту или две, чтобы изучить код и посмотреть, как в таблице запрашиваются наиболее распространенные сообщения о фиксации.
Вернувшись в Cloud Shell, запустите приложение:
node queryGitHub.js
Вы должны увидеть список сообщений о фиксации и их появление:
Rows:
Update README.md: 2572220
: 1985733
Initial commit: 1940228
Mirroring from Micro.blog.: 646772
update: 592520
Update data.json: 548730
Update data.js: 548354
...
9. Кэширование и статистика
Когда вы запускаете запрос, BigQuery кэширует результаты. В результате последующие идентичные запросы занимают гораздо меньше времени. Кэширование можно отключить с помощью параметров запроса. BigQuery также отслеживает некоторые статистические данные о запросах, такие как время создания, время окончания и общее количество обработанных байтов.
На этом этапе вы отключите кеширование и отобразите некоторую статистику по запросам.
Перейдите к файлу queryShakespeare.js
в папке BigQueryDemo
и замените код следующим:
'use strict';
function main() {
// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
async function queryShakespeareDisableCache() {
// Queries the Shakespeare dataset with the cache disabled.
// Create a client
const bigqueryClient = new BigQuery();
const sqlQuery = `SELECT word, word_count
FROM \`bigquery-public-data.samples.shakespeare\`
WHERE corpus = @corpus
AND word_count >= @min_word_count
ORDER BY word_count DESC`;
const options = {
query: sqlQuery,
// Location must match that of the dataset(s) referenced in the query.
location: 'US',
params: {corpus: 'romeoandjuliet', min_word_count: 250},
useQueryCache: false,
};
// Run the query as a job
const [job] = await bigqueryClient.createQueryJob(options);
console.log(`Job ${job.id} started.`);
// Wait for the query to finish
const [rows] = await job.getQueryResults();
// Print the results
console.log('Rows:');
rows.forEach(row => console.log(row));
// Print job statistics
console.log('JOB STATISTICS:')
console.log(`Status: ${job.metadata.status.state}`);
console.log(`Creation time: ${job.metadata.statistics.creationTime}`);
console.log(`Start time: ${job.metadata.statistics.startTime}`);
console.log(`Statement type: ${job.metadata.statistics.query.statementType}`);
}
queryShakespeareDisableCache();
}
main();
Несколько замечаний по поводу кода. Во-первых, кеширование отключается путем установки UseQueryCache
значения false
внутри объекта options
. Во-вторых, вы получили доступ к статистике запроса из объекта задания.
Вернувшись в Cloud Shell, запустите приложение:
node queryShakespeare.js
Вы должны увидеть список сообщений о фиксации и их появление. Кроме того, вы также должны увидеть некоторую статистику по запросу:
Rows:
{ word: 'the', word_count: 614 }
{ word: 'I', word_count: 577 }
{ word: 'and', word_count: 490 }
{ word: 'to', word_count: 486 }
{ word: 'a', word_count: 407 }
{ word: 'of', word_count: 367 }
{ word: 'my', word_count: 314 }
{ word: 'is', word_count: 307 }
{ word: 'in', word_count: 291 }
{ word: 'you', word_count: 271 }
{ word: 'that', word_count: 270 }
{ word: 'me', word_count: 263 }
JOB STATISTICS:
Status: RUNNING
Creation time: 1554309220660
Start time: 1554309220793
Statement type: SELECT
10. Загрузка данных в BigQuery
Если вы хотите запросить собственные данные, вам необходимо сначала загрузить их в BigQuery. BigQuery поддерживает загрузку данных из многих источников, таких как Google Cloud Storage, другие сервисы Google или локальный, читаемый источник. Вы даже можете передавать свои данные в потоковом режиме. Подробную информацию можно прочитать на странице Загрузка данных в BigQuery .
На этом этапе вы загрузите файл JSON, хранящийся в Google 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 .
Copying gs://cloud-samples-data/bigquery/us-states/us-states.json...
/ [1 files][ 2.0 KiB/ 2.0 KiB]
Operation completed over 1 objects/2.0 KiB.
Вы можете видеть, что он содержит список штатов США, и каждый штат представляет собой объект JSON в отдельной строке:
less us-states.json
{"name": "Alabama", "post_abbr": "AL"}
{"name": "Alaska", "post_abbr": "AK"}
...
Чтобы загрузить этот файл JSON в BigQuery, создайте файл createDataset.js
и файл loadBigQueryJSON.js
в папке BigQueryDemo
:
touch createDataset.js
touch loadBigQueryJSON.js
Установите клиентскую библиотеку Google Cloud Storage Node.js:
npm install --save @google-cloud/storage
Перейдите к файлу createDataset.js
и вставьте следующий код:
'use strict';
function main() {
// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
async function createDataset() {
const datasetId = "my_states_dataset3";
const bigqueryClient = new BigQuery();
// Specify the geographic location where the dataset should reside
const options = {
location: 'US',
};
// Create a new dataset
const [dataset] = await bigqueryClient.createDataset(datasetId, options);
console.log(`Dataset ${dataset.id} created.`);
}
createDataset();
}
main();
Затем перейдите к файлу loadBigQueryJSON.js
и вставьте следующий код:
'use strict';
function main() {
// Import the Google Cloud client libraries
const {BigQuery} = require('@google-cloud/bigquery');
const {Storage} = require('@google-cloud/storage');
const datasetId = "my_states_dataset3";
const tableId = "my_states_table";
async function createTable(datasetId, tableId) {
// Creates a new table
// Create a client
const bigqueryClient = new BigQuery();
const options = {
location: 'US',
};
// Create a new table in the dataset
const [table] = await bigqueryClient
.dataset(datasetId)
.createTable(tableId, options);
console.log(`Table ${table.id} created.`);
}
async function loadJSONFromGCS(datasetId, tableId) {
// Import a GCS file into a table with manually defined schema.
// Instantiate clients
const bigqueryClient = new BigQuery();
const storageClient = new Storage();
const bucketName = 'cloud-samples-data';
const filename = 'bigquery/us-states/us-states.json';
// Configure the load job.
const metadata = {
sourceFormat: 'NEWLINE_DELIMITED_JSON',
schema: {
fields: [
{name: 'name', type: 'STRING'},
{name: 'post_abbr', type: 'STRING'},
],
},
location: 'US',
};
// Load data from a Google Cloud Storage file into the table
const [job] = await bigqueryClient
.dataset(datasetId)
.table(tableId)
.load(storageClient.bucket(bucketName).file(filename), metadata);
// load() waits for the job to finish
console.log(`Job ${job.id} completed.`);
// Check the job's status for errors
const errors = job.status.errors;
if (errors && errors.length > 0) {
throw errors;
}
}
// createDataset(datasetId);
createTable(datasetId, tableId);
loadJSONFromGCS(datasetId, tableId);
}
main();
Уделите минуту или две, чтобы изучить, как код загружает файл JSON и создает таблицу (со схемой) в наборе данных.
Вернувшись в Cloud Shell, запустите приложение:
node createDataset.js
node loadBigQueryJSON.js
В BigQuery создаются набор данных и таблица:
Table my_states_table created.
Job [JOB ID] completed.
Чтобы убедиться, что набор данных создан, вы можете перейти в веб-интерфейс BigQuery. Вы должны увидеть новый набор данных и таблицу. Если вы перейдете на вкладку «Предварительный просмотр» таблицы, вы сможете увидеть фактические данные:
11. Поздравляем!
Вы узнали, как использовать BigQuery с помощью Node.js!
Очистить
Чтобы избежать списания средств с вашей учетной записи Google Cloud Platform за ресурсы, используемые в этом кратком руководстве:
- Перейдите в консоль облачной платформы .
- Выберите проект, который хотите закрыть, затем нажмите «Удалить» вверху: это запланирует удаление проекта.
Узнать больше
- Google BigQuery: https://cloud.google.com/bigquery/docs/
- Node.js на облачной платформе Google: https://cloud.google.com/nodejs/
- Клиентская библиотека Google BigQuery Node.js: https://github.com/googleapis/nodejs-bigquery
Лицензия
Эта работа распространяется под лицензией Creative Commons Attribution 2.0 Generic License.