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

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. Настройка и требования

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

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

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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

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

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

Запустить Cloud Shell

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

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

  1. В Cloud Console нажмите «Активировать Cloud Shell». dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwa vOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jZ1tYfi2lyXqvW3WFHP0eAxDkQDfpO9L jw .

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

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

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Эта виртуальная машина оснащена всеми необходимыми инструментами разработки. Он предлагает постоянный домашний каталог объемом 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`
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:

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

Вернувшись в 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 License.