Membuat kueri data Bigtable

Dokumen ini menjelaskan cara membuat kueri data yang disimpan di tabel eksternal Bigtable.

Bigtable adalah database NoSQL Google yang jarang diisi data, yang dapat diskalakan hingga miliaran baris, ribuan kolom, dan petabyte data. Untuk mengetahui informasi tentang model data Bigtable, lihat Model penyimpanan.

Membuat kueri tabel eksternal permanen

Sebelum memulai, Anda atau seseorang di organisasi Anda harus membuat tabel eksternal yang dapat digunakan. Untuk mengetahui detail dan izin yang diperlukan, lihat Membuat tabel eksternal BigQuery.

Peran yang diperlukan

Untuk membuat kueri tabel eksternal permanen Bigtable, pastikan Anda memiliki peran berikut:

  • BigQuery Data Viewer (roles/bigquery.dataViewer)
  • BigQuery User (roles/bigquery.user)
  • Bigtable Reader (roles/bigtable.reader)

Bergantung pada izin Anda, Anda dapat memberikan peran ini kepada diri sendiri atau meminta administrator untuk memberikannya kepada Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Melihat peran yang dapat diberikan pada resource.

Guna melihat izin spesifik BigQuery yang diperlukan untuk membuat kueri tabel eksternal, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Membuat kueri tabel

Anda dapat menjalankan kueri terhadap tabel eksternal permanen Bigtable, sama seperti jika kueri tersebut adalahtabel BigQuery standar, yang tunduk padapembatasan sumber data eksternal. Untuk mengetahui informasi selengkapnya, lihat Menjalankan kueri interaktif dan batch.

Membuat kueri tabel eksternal sementara

Membuat kueri sumber data eksternal menggunakan tabel sementara berguna untuk kueri ad-hoc satu kali atas data eksternal, atau untuk proses ekstrak, transformasi, dan pemuatan (ETL).

Untuk membuat kueri sumber data eksternal tanpa membuat tabel permanen, Anda perlu memberikan definisi tabel untuk tabel sementara, lalu menggunakan definisi tabel tersebut dalam perintah atau panggilan untuk membuat kueri tabel sementara. Anda dapat memberikan definisi tabel dengan salah satu cara berikut:

File definisi tabel atau skema yang disediakan digunakan untuk membuat tabel eksternal sementara, dan kueri dijalankan terhadap tabel eksternal sementara.

Saat menggunakan tabel eksternal sementara, Anda tidak membuat tabel di salah satu set data BigQuery Anda. Karena tidak disimpan secara permanen dalam set data, tabel itu tidak dapat dibagikan kepada orang lain.

Penggunaan tabel eksternal sementara, bukan tabel eksternal permanen, memiliki beberapa batasan, termasuk yang berikut:

  • Anda harus memiliki peran Bigtable Admin (roles/bigtable.admin).
  • Pendekatan ini tidak memungkinkan Anda menggunakan Konsol Google Cloud untuk menyimpulkan skema tabel Bigtable dan secara otomatis membuat definisi tabel. Anda harus membuat definisi tabel sendiri.

Peran yang diperlukan

Untuk membuat kueri tabel eksternal sementara Bigtable, pastikan Anda memiliki peran berikut:

  • BigQuery Data Viewer (roles/bigquery.dataViewer)
  • BigQuery User (roles/bigquery.user)
  • Bigtable Admin (roles/bigtable.admin)

Bergantung pada izin Anda, Anda dapat memberikan peran ini kepada diri sendiri atau meminta administrator untuk memberikannya kepada Anda. Untuk mengetahui informasi selengkapnya tentang cara memberikan peran, lihat Melihat peran yang dapat diberikan pada resource.

Guna melihat izin spesifik BigQuery yang diperlukan untuk membuat kueri tabel eksternal, luaskan bagian Izin yang diperlukan:

Izin yang diperlukan

Anda mungkin juga bisa mendapatkan izin ini dengan peran khusus atau peran bawaan lainnya.

Membuat dan mengkueri tabel

Untuk membuat kueri data Bigtable menggunakan tabel eksternal sementara, Anda:

Pembuatan dan kueri tabel eksternal sementara didukung oleh alat command line bq dan API.

bq

Untuk membuat kueri tabel sementara menggunakan file definisi tabel, masukkan perintah bq query dengan flag --external_table_definition.

(Opsional) Berikan flag --location dan tetapkan nilainya ke lokasi Anda.

bq --location=LOCATION query \
--use_legacy_sql=false \
--external_table_definition=TABLE::DEFINITION_FILE \
'QUERY'

Ganti kode berikut:

  • LOCATION: nama lokasi Anda. Flag --location bersifat opsional.
  • TABLE: nama tabel sementara yang Anda buat.
  • DEFINITION_FILE: jalur ke file definisi tabel di mesin lokal Anda.
  • QUERY: kueri yang Anda kirimkan ke tabel sementara.

Misalnya, perintah berikut membuat dan mengkueri tabel sementara bernama follows menggunakan file definisi tabel bernama follows_def.

bq query \
--use_legacy_sql=false \
--external_table_definition=follows::/tmp/follows_def \
'SELECT
  COUNT(rowkey)
 FROM
   follows'

API

  • Buat kueri. Lihat Membuat kueri data untuk mengetahui informasi tentang cara membuat tugas kueri.

  • (Opsional) Tentukan lokasi Anda di properti location di bagian jobReference pada resource tugas.

  • Tentukan properti sumber data eksternal dengan menetapkan ExternalDataConfiguration untuk resource tabel.

Java

Sebelum mencoba contoh ini, ikuti petunjuk penyiapan Java di Panduan memulai BigQuery menggunakan library klien. Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi BigQuery Java API.

Untuk melakukan autentikasi ke BigQuery, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.BigtableColumn;
import com.google.cloud.bigquery.BigtableColumnFamily;
import com.google.cloud.bigquery.BigtableOptions;
import com.google.cloud.bigquery.ExternalTableDefinition;
import com.google.cloud.bigquery.QueryJobConfiguration;
import com.google.cloud.bigquery.TableResult;
import com.google.common.collect.ImmutableList;
import org.apache.commons.codec.binary.Base64;

// Sample to queries an external bigtable data source using a temporary table
public class QueryExternalBigtableTemp {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String bigtableInstanceId = "MY_INSTANCE_ID";
    String bigtableTableName = "MY_BIGTABLE_NAME";
    String bigqueryTableName = "MY_TABLE_NAME";
    String sourceUri =
        String.format(
            "https://googleapis.com/bigtable/projects/%s/instances/%s/tables/%s",
            projectId, bigtableInstanceId, bigtableTableName);
    String query = String.format("SELECT * FROM %s ", bigqueryTableName);
    queryExternalBigtableTemp(bigqueryTableName, sourceUri, query);
  }

  public static void queryExternalBigtableTemp(String tableName, String sourceUri, String query) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      BigtableColumnFamily.Builder statsSummary = BigtableColumnFamily.newBuilder();

      // Configuring Columns
      BigtableColumn connectedCell =
          BigtableColumn.newBuilder()
              .setQualifierEncoded(Base64.encodeBase64String("connected_cell".getBytes()))
              .setFieldName("connected_cell")
              .setType("STRING")
              .setEncoding("TEXT")
              .build();
      BigtableColumn connectedWifi =
          BigtableColumn.newBuilder()
              .setQualifierEncoded(Base64.encodeBase64String("connected_wifi".getBytes()))
              .setFieldName("connected_wifi")
              .setType("STRING")
              .setEncoding("TEXT")
              .build();
      BigtableColumn osBuild =
          BigtableColumn.newBuilder()
              .setQualifierEncoded(Base64.encodeBase64String("os_build".getBytes()))
              .setFieldName("os_build")
              .setType("STRING")
              .setEncoding("TEXT")
              .build();

      // Configuring column family and columns
      statsSummary
          .setColumns(ImmutableList.of(connectedCell, connectedWifi, osBuild))
          .setFamilyID("stats_summary")
          .setOnlyReadLatest(true)
          .setEncoding("TEXT")
          .setType("STRING")
          .build();

      // Configuring BigtableOptions is optional.
      BigtableOptions options =
          BigtableOptions.newBuilder()
              .setIgnoreUnspecifiedColumnFamilies(true)
              .setReadRowkeyAsString(true)
              .setColumnFamilies(ImmutableList.of(statsSummary.build()))
              .build();

      // Configure the external data source and query job.
      ExternalTableDefinition externalTable =
          ExternalTableDefinition.newBuilder(sourceUri, options).build();
      QueryJobConfiguration queryConfig =
          QueryJobConfiguration.newBuilder(query)
              .addTableDefinition(tableName, externalTable)
              .build();

      // Example query
      TableResult results = bigquery.query(queryConfig);

      results
          .iterateAll()
          .forEach(row -> row.forEach(val -> System.out.printf("%s,", val.toString())));

      System.out.println("Query on external temporary table performed successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Query not performed \n" + e.toString());
    }
  }
}

Pertimbangan performa

Performa kueri terhadap sumber data eksternal Bigtable bergantung pada tiga faktor:

  • Jumlah baris
  • Jumlah data yang dibaca
  • Tingkat paralelisasi

BigQuery mencoba membaca data sesedikit mungkin dengan hanya membaca grup kolom yang direferensikan dalam kueri. Tingkat paralelisasi bergantung pada jumlah node yang Anda miliki di cluster Bigtable dan jumlah pemisahan yang Anda miliki untuk tabel.

Perhatikan bahwa Bigtable otomatis menggabungkan pemisahan berdasarkan muatan. Jika tabel Anda tidak sering dibaca, akan ada lebih sedikit pemisahan seiring waktu dan penurunan performa kueri secara bertahap. Untuk mengetahui informasi selengkapnya tentang pemisahan tabel berdasarkan row key, lihat Mengelola tabel.

Membuat kueri Bigtable dari BigQuery akan menggunakan siklus CPU Bigtable. Penggunaan CPU oleh BigQuery dapat memengaruhi latensi dan throughput untuk permintaan serentak lainnya, seperti penyaluran traffic pengguna live. Misalnya, penggunaan CPU yang tinggi di Bigtable memengaruhi kueri longtail dan meningkatkan latensi pada persentil ke-99.

Anda harus memantau penggunaan CPU Bigtable untuk memastikan bahwa Anda berada dalam batas yang direkomendasikan seperti yang tercantum dalam dasbor pemantauan Bigtable di Konsol Google Cloud. Dengan meningkatkan jumlah node untuk instance, Anda dapat menangani traffic BigQuery dan traffic dari permintaan serentak lainnya.

Filter kueri

Kueri dengan filter kesetaraan baris hanya membaca baris tertentu tersebut. Misalnya, dalam sintaksis GoogleSQL:

SELECT
  COUNT(follows.column.name)
FROM
  `dataset.table`
WHERE
  rowkey = "alice";

Filter rentang seperti rowkey > '1' dan rowkey < '8' juga didukung, tetapi hanya jika row key dibaca sebagai string dengan opsi readRowkeyAsString.