Использование BigQuery с Node.js

1. Обзор

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

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

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

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

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

  • Проект Google Cloud Platform
  • Браузер, например Chrome или Firefox.
  • Знание Node.js

Опрос

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

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

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

Новичок Средний Профессионал

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

Новичок Средний Профессионал

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

Настройка среды для самостоятельного обучения

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8 fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Запомните идентификатор проекта (Project ID) — уникальное имя для всех проектов Google Cloud (указанное выше имя уже занято и вам не подойдёт, извините!). В дальнейшем в этом практическом занятии оно будет обозначаться как PROJECT_ID .

  1. Далее вам потребуется включить оплату в Cloud Console, чтобы использовать ресурсы Google Cloud.

Выполнение этого практического задания не должно стоить дорого, если вообще что-либо. Обязательно следуйте инструкциям в разделе «Очистка», где указано, как отключить ресурсы, чтобы избежать дополнительных расходов после завершения этого урока. Новые пользователи Google Cloud имеют право на бесплатную пробную версию стоимостью 300 долларов США .

Запустить Cloud Shell

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

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

  1. В консоли Cloud нажмите «Активировать Cloud Shell» . dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9Ljw .

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Она предоставляет постоянный домашний каталог размером 5 ГБ и работает в облаке Google, что значительно повышает производительность сети и аутентификацию. Большая часть, если не вся, работа в этом практическом задании может быть выполнена с помощью обычного браузера или вашего 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`
gcloud config list project

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

[core]
project = <PROJECT_ID>

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

gcloud config set project <PROJECT_ID>

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

Updated property [core/project].

3. Включите API BigQuery.

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

gcloud services list

В списке должен отображаться BigQuery:

NAME                              TITLE
bigquery-json.googleapis.com      BigQuery API
...

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

gcloud services enable bigquery-json.googleapis.com

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

Для отправки запросов к API BigQuery вам потребуется использовать сервисный аккаунт . Сервисный аккаунт принадлежит вашему проекту и используется клиентской библиотекой Google BigQuery Node.js для отправки запросов к API BigQuery. Как и любая другая учетная запись пользователя, сервисный аккаунт представлен адресом электронной почты. В этом разделе вы будете использовать 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 , которая используется библиотекой C# API BigQuery (описанной на следующем шаге), чтобы найти свои учетные данные. Переменная среды должна быть установлена ​​на полный путь к созданному вами JSON-файлу с учетными данными. Установите переменную среды с помощью следующей команды:

export GOOGLE_APPLICATION_CREDENTIALS="/home/${USER}/key.json"

Вы можете узнать больше об аутентификации в API BigQuery .

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

BigQuery использует систему управления идентификацией и доступом (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:

9b8f365ab5ec7f71.png

Создайте файл 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

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

d3f0dc7400fbe678.png

Создайте файл 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 . Во-вторых, вы получаете доступ к статистике запроса из объекта job.

Вернувшись в 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. Вы должны увидеть новый набор данных и таблицу. Если вы перейдете на вкладку «Предварительный просмотр» таблицы, вы сможете увидеть фактические данные:

4fb7296ae901e8fd.png

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

Вы научились использовать BigQuery с помощью Node.js!

Уборка

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

  • Перейдите в консоль облачной платформы .
  • Выберите проект, который хотите закрыть, затем нажмите кнопку «Удалить» вверху: это запланирует удаление проекта.

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

Лицензия

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