Menggunakan BigQuery dengan Node.js

1. Ringkasan

BigQuery adalah data warehouse analisis berharga terjangkau yang terkelola sepenuhnya dan berskala petabyte dari Google. BigQuery dalam kondisi NoOps. Tidak ada infrastruktur yang harus dikelola dan Anda tidak memerlukan administrator database. Dengan begitu, Anda dapat berfokus pada analisis data untuk menemukan insight yang bermakna, menggunakan SQL yang sudah dikenal, dan memanfaatkan model bayar sesuai penggunaan.

Dalam codelab ini, Anda akan menggunakan Library Klien Google Cloud BigQuery untuk mengkueri set data publik BigQuery dengan Node.js.

Yang akan Anda pelajari

  • Cara menggunakan Cloud Shell
  • Cara mengaktifkan BigQuery API
  • Cara Mengautentikasi permintaan API
  • Cara menginstal library klien BigQuery untuk Node.js
  • Cara membuat kueri karya Shakespeare
  • Cara membuat kueri set data GitHub
  • Cara menyesuaikan statistik tampilan dan penyimpanan cache

Yang Anda butuhkan

  • Project Google Cloud Platform
  • Browser, seperti Chrome atau Firefox
  • Pemahaman dalam menggunakan Node.js

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman Anda dengan Node.js?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud Platform?

Pemula Menengah Mahir

2. Penyiapan dan Persyaratan

Penyiapan lingkungan mandiri

  1. Login ke Cloud Console dan buat project baru atau gunakan kembali project yang sudah ada. (Jika belum memiliki akun Gmail atau G Suite, Anda harus membuatnya.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

Ingat project ID, nama unik di semua project Google Cloud (maaf, nama di atas telah digunakan dan tidak akan berfungsi untuk Anda!) Project ID tersebut selanjutnya akan dirujuk di codelab ini sebagai PROJECT_ID.

  1. Selanjutnya, Anda harus mengaktifkan penagihan di Cloud Console untuk menggunakan resource Google Cloud.

Menjalankan operasi dalam codelab ini seharusnya tidak memerlukan banyak biaya, bahkan mungkin tidak sama sekali. Pastikan untuk mengikuti petunjuk yang ada di bagian "Membersihkan" yang memberi tahu Anda cara menonaktifkan resource sehingga tidak menimbulkan penagihan di luar tutorial ini. Pengguna baru Google Cloud memenuhi syarat untuk mengikuti program Uji Coba Gratis senilai $300 USD.

Mulai Cloud Shell

Meskipun alat command line Cloud SDK dapat dioperasikan secara jarak jauh dari laptop, dalam codelab ini Anda akan menggunakan Google Cloud Shell, yakni lingkungan command line yang berjalan di cloud.

Mengaktifkan Cloud Shell

  1. Dari Cloud Console, klik Aktifkan Cloud Shell dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwJqtmeeW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmefiW8jX08jwJqtmeeFiW8jX08j.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

Jika belum pernah memulai Cloud Shell, Anda akan melihat layar perantara (di paruh bawah) yang menjelaskan apa itu Cloud Shell. Jika demikian, klik Lanjutkan (dan Anda tidak akan pernah melihatnya lagi). Berikut tampilan layar sekali-tampil tersebut:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzunsqM

Perlu waktu beberapa saat untuk penyediaan dan terhubung ke Cloud Shell.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

Mesin virtual ini dimuat dengan semua alat pengembangan yang Anda butuhkan. Layanan ini menawarkan direktori beranda tetap sebesar 5 GB dan beroperasi di Google Cloud, sehingga sangat meningkatkan performa dan autentikasi jaringan. Sebagian besar pekerjaan Anda dalam codelab ini dapat dilakukan hanya dengan browser atau Chromebook.

Setelah terhubung ke Cloud Shell, Anda akan melihat bahwa Anda sudah diautentikasi dan project sudah ditetapkan ke project ID Anda.

  1. Jalankan perintah berikut di Cloud Shell untuk mengonfirmasi bahwa Anda telah diautentikasi:
gcloud auth list

Output perintah

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

To set the active account, run:
    $ gcloud config set account `ACCOUNT`
gcloud config list project

Output perintah

[core]
project = <PROJECT_ID>

Jika tidak, Anda dapat menyetelnya dengan perintah ini:

gcloud config set project <PROJECT_ID>

Output perintah

Updated property [core/project].

3. Mengaktifkan BigQuery API

BigQuery API harus diaktifkan secara default di semua project Google Cloud. Anda dapat memeriksa kebenarannya dengan perintah berikut di Cloud Shell:

gcloud services list

Anda akan melihat BigQuery tercantum:

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

Jika BigQuery API tidak diaktifkan, Anda dapat menggunakan perintah berikut di Cloud Shell untuk mengaktifkannya:

gcloud services enable bigquery-json.googleapis.com

4. Melakukan Autentikasi permintaan API

Untuk membuat permintaan ke BigQuery API, Anda harus menggunakan Akun Layanan. Akun Layanan merupakan milik project Anda, dan digunakan oleh library klien Node.js Google BigQuery untuk membuat permintaan BigQuery API. Seperti akun pengguna lainnya, akun layanan diwakili oleh alamat email. Di bagian ini, Anda akan menggunakan Cloud SDK untuk membuat akun layanan, lalu membuat kredensial yang diperlukan untuk melakukan autentikasi sebagai akun layanan.

Pertama, tetapkan variabel lingkungan dengan PROJECT_ID, yang akan Anda gunakan pada codelab ini:

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

Selanjutnya, buat akun layanan baru untuk mengakses BigQuery API menggunakan:

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

Selanjutnya, buat kredensial yang akan digunakan kode Node.js untuk login sebagai akun layanan baru. Buat kredensial ini dan simpan sebagai file JSON "~/key.json" dengan menggunakan perintah berikut:

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

Terakhir, tetapkan variabel lingkungan GOOGLE_APPLICATION_CREDENTIALS, yang digunakan library C# BigQuery API, yang dibahas pada langkah berikutnya, untuk menemukan kredensial Anda. Variabel lingkungan harus ditetapkan ke jalur lengkap file JSON kredensial yang Anda buat. Tetapkan variabel lingkungan menggunakan perintah berikut:

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

Anda dapat membaca lebih lanjut cara mengautentikasi BigQuery API.

5. Menyiapkan Kontrol Akses

BigQuery menggunakan Identity and Access Management (IAM) untuk mengelola akses ke resource. BigQuery memiliki sejumlah peran bawaan (pengguna, dataOwner, dataViewer, dll.) yang dapat Anda tetapkan ke akun layanan yang Anda buat di langkah sebelumnya. Anda dapat membaca Kontrol Akses lebih lanjut di dokumentasi BigQuery.

Sebelum dapat mengkueri set data publik, Anda perlu memastikan akun layanan setidaknya memiliki peran bigquery.user. Di Cloud Shell, jalankan perintah berikut untuk menetapkan peran bigquery.user ke akun layanan:

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

Anda dapat menjalankan perintah berikut untuk memastikan akun layanan diberi peran pengguna:

gcloud projects get-iam-policy $GOOGLE_CLOUD_PROJECT

6. Menginstal library klien BigQuery untuk Node.js

Pertama, buat folder BigQueryDemo dan buka folder tersebut:

mkdir BigQueryDemo
cd BigQueryDemo

Selanjutnya, buat project Node.js yang akan Anda gunakan untuk menjalankan contoh library klien BigQuery:

npm init -y

Anda akan melihat project Node.js yang dibuat:

{
  "name": "BigQueryDemo",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [],
  "author": "",
  "license": "ISC"
}

Instal library klien 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

Sekarang, Anda siap untuk menggunakan library klien BigQuery Node.js.

7. Mengkueri karya Shakespeare

{i>Dataset<i} publik adalah {i>dataset<i} yang disimpan di BigQuery dan tersedia untuk umum. Ada banyak {i>dataset<i} publik lain yang tersedia untuk Anda kueri, beberapa di antaranya juga di-{i>host<i} oleh Google, tetapi banyak lagi yang di-{i>host <i}oleh pihak ketiga. Anda dapat membaca lebih lanjut di halaman Set Data Publik.

Selain set data publik, BigQuery menyediakan beberapa contoh tabel yang dapat Anda kueri. Tabel ini terdapat di bigquery-public-data:samples dataset. Salah satu tabel tersebut disebut shakespeare. Tabel ini berisi indeks kata karya Shakespeare, yang memberikan berapa kali setiap kata muncul di setiap korpus.

Pada langkah ini, Anda akan melakukan kueri tabel shakespeare.

Pertama, buka editor kode dari sisi kanan atas Cloud Shell:

9b8f365ab5ec7f71.pngS

Buat file queryShakespeare.js di dalam folder BigQueryDemo :

 touch queryShakespeare.js

Buka file queryShakespeare.js dan sisipkan kode berikut:

'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();

Luangkan waktu satu atau dua menit untuk mempelajari kode dan lihat bagaimana tabel dikueri.

Kembali ke Cloud Shell, jalankan aplikasi:

node queryShakespeare.js

Anda akan melihat daftar kata dan kemunculannya:

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. Mengkueri set data GitHub

Agar dapat lebih memahami BigQuery, sekarang Anda akan mengeluarkan kueri terhadap set data publik GitHub. Anda akan menemukan pesan commit yang paling umum di GitHub. Anda juga akan menggunakan UI web BigQuery untuk melihat pratinjau dan menjalankan kueri ad-hoc.

Untuk melihat data, buka set data GitHub di UI web BigQuery:

https://console.cloud.google.com/bigquery?p=bigquery-public-data&amp;d=github_repos&amp;t=commits&amp;page=table

Untuk melihat pratinjau cepat dari tampilan data, klik tab Pratinjau:

d3f0dc7400fbe678.png

Buat file queryGitHub.js di dalam folder BigQueryDemo:

 touch queryGitHub.js

Buka file queryGitHub.js dan sisipkan kode berikut:

'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();

Luangkan waktu satu atau dua menit untuk mempelajari kode dan lihat bagaimana tabel dikueri untuk pesan commit yang paling umum.

Kembali ke Cloud Shell, jalankan aplikasi:

node queryGitHub.js

Anda akan melihat daftar pesan commit dan kemunculannya:

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. Cache dan statistik

Saat Anda menjalankan kueri, BigQuery akan meng-cache hasilnya. Akibatnya, kueri identik berikutnya membutuhkan waktu lebih sedikit. Anda dapat menonaktifkan penyimpanan cache menggunakan opsi kueri. BigQuery juga melacak beberapa statistik tentang kueri seperti waktu pembuatan, waktu berakhir, dan total byte yang diproses.

Pada langkah ini, Anda akan menonaktifkan penyimpanan cache dan menampilkan beberapa statistik tentang kueri.

Buka file queryShakespeare.js di dalam folder BigQueryDemo dan ganti kode dengan kode berikut:

'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();

Beberapa hal yang perlu diperhatikan tentang kode. Pertama, penyimpanan dalam cache dinonaktifkan dengan menyetel UseQueryCache ke false di dalam objek options. Kedua, Anda mengakses statistik tentang kueri dari objek tugas.

Kembali ke Cloud Shell, jalankan aplikasi:

node queryShakespeare.js

Anda akan melihat daftar pesan commit dan kemunculannya. Selain itu, Anda juga akan melihat beberapa statistik tentang kueri:

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. Memuat data ke BigQuery.

Jika ingin membuat kueri data sendiri, Anda harus memuat data Anda ke BigQuery terlebih dahulu. BigQuery mendukung pemuatan data dari banyak sumber seperti Google Cloud Storage, layanan Google lainnya, atau sumber lokal yang dapat dibaca. Anda bahkan dapat melakukan streaming data. Anda dapat membaca selengkapnya di halaman Memuat Data ke BigQuery.

Pada langkah ini, Anda akan memuat file JSON yang disimpan di Google Cloud Storage ke dalam tabel BigQuery. File JSON berada di: gs://cloud-samples-data/bigquery/us-states/us-states.json

Jika ingin tahu tentang konten file JSON, Anda dapat menggunakan alat command line gsutil untuk mendownloadnya di 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.

Anda dapat melihat bahwa ini berisi daftar negara bagian AS, dan setiap negara bagian adalah objek JSON pada baris terpisah:

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

Untuk memuat file JSON ini ke BigQuery, buat file createDataset.js dan file loadBigQueryJSON.js di dalam folder BigQueryDemo:

touch createDataset.js 
touch loadBigQueryJSON.js

Instal library klien Node.js Google Cloud Storage:

 npm install --save @google-cloud/storage

Buka file createDataset.js dan sisipkan kode berikut:

'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();

Lalu, buka file loadBigQueryJSON.js dan sisipkan kode berikut:

'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();

Luangkan waktu satu atau dua menit untuk mempelajari bagaimana kode memuat file JSON dan membuat tabel (dengan skema) dalam set data.

Kembali ke Cloud Shell, jalankan aplikasi:

node createDataset.js
node loadBigQueryJSON.js

Set data dan tabel dibuat di BigQuery:

Table my_states_table created.
Job [JOB ID] completed.

Untuk memverifikasi bahwa set data telah dibuat, Anda dapat membuka UI web BigQuery. Anda akan melihat set data baru dan tabel. Jika beralih ke tab Pratinjau tabel, Anda dapat melihat data sebenarnya:

4fb7296ae901e8fd.png

11. Selamat!

Anda telah mempelajari cara menggunakan BigQuery dengan Node.js.

Pembersihan

Agar tidak menimbulkan biaya pada akun Google Cloud Platform Anda untuk resource yang digunakan di panduan memulai ini:

  • Buka Cloud Platform Console.
  • Pilih project yang ingin dinonaktifkan, lalu klik 'Delete' di bagian atas: tindakan ini menjadwalkan penghapusan project.

Pelajari Lebih Lanjut

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.