【新機能】BigQuery data canvasを早速触ってみた #GoogleCloudNext

2024.04.11

Google Cloudデータエンジニアのはんざわです。
現在開催中のGoogle Cloud Next'24でBigQuery data canvasという新機能が追加されました。

本記事では早速この新機能を触ってみたいと思います!

BigQuery data canvas とは?

BigQuery data canvasは、データソースの選択、クエリの実行、可視化をDAGで操作できる分析用のインターフェイスです。
また、Geminiのサポートにより、自然言語を使用したデータの検索やSQLの作成、グラフの生成も行うことが可能です。

  • BigQuery data canvasの公式ドキュメント

それでは早速触ってみたいと思います!

注意

2024年4月10日時点でBigQuery data canvasはprivate プレビューで、使用するためにはRequest BigQuery data canvas accessのフォーム申請が必要になっています。
今すぐに触ってみたい方は上記フォームに従って、有効化の設定を進めてください。

以下の公式ブログによると4月15日からpublic プレビューとなり、全ユーザーに展開されるようです。

BigQuery data canvas is launching in preview and will be rolled out to all users starting on April 15th

サンプルデータで試してみる

この検証では、データセットを東京リージョンに移動させたBigQueryサンプルテーブルgsodを使用し、年毎の降水量を棒グラフで表示させてみたいと思います。

まずはBigQuery Studioのコンソールから下記のどちらかでデータキャンパスを作成を選択します。

選択すると以下のような画面に移動し、最近使用したテーブルや保存したクエリ、最近のクエリを確認できます。

テーブルの検索ボックスにgsodと入力し、対象のテーブルの右にあるADD TO CANVASを選択します。
公式ドキュメントによるとテーブルの検索はdataplexのメタデータと連携し、適切なテーブルを推薦するそうです。
積極的に活用するためには、メタデータの整備の重要性が上がってくると予想されます。

するとキャンパス上で通常のテーブル通りにテーブルの詳細や中身を確認することができます。
このテーブルにクエリを実行したいのでクエリを選択します。

選択するとクエリを実行できる画面が表示されます。
Geminiでクエリを生成することも可能ですし、自分でクエリを入力することも可能です。

せっかくなので今回はGeminiでクエリを生成してみたいと思います。
今回は年毎に降水量を算出したいのでshow yearly amount of precipitationと入力し、右の矢印ボタンを選択します。

以下のようなクエリが生成されました。

SELECT
  gsod.year,
  SUM(gsod.total_precipitation) AS total_precipitation
FROM
  `<PROJECT_ID>.samples_dataset.gsod` AS gsod
GROUP BY
  1

生成されたクエリとドライランの結果を確認し、問題ないようであれば赤枠の実行を選択します。

クエリが正常に成功しました。
次にデータを可視化したいので、下の可視化から棒グラフの作成を選択します。

すると以下のようなグラフとその考察が表示されます。

全体像は以下のようになっています。

サンプルテーブルを使用し、可視化することができました。
データを可視化するまでの過程が一目で把握できる点は優れていると感じました!
次はもう少し複雑なデータを作成し、可視化してみたいと思います。

少し複雑なテーブルで試してみる

この検証では複数のテーブルで結合が発生するケースを試してみたいと思います。
例として、商品テーブルと顧客注文テーブルと顧客情報テーブルの3つのテーブルが存在すると仮定します。
結合の方法として、先に顧客注文テーブルと商品テーブルを結合し、最後に顧客情報テーブルを結合します。

それでは早速試してみましょう!

前準備

まずは検証に使用するテーブルを作成します。(サンプルデータ作成の際には一部で生成AIを使用しました。)
テーブル名とカラムは以下のような想定です。

  • 商品テーブル(Products
    • ProductID: 商品ID
    • ProductName: 商品名
    • Price: 金額
  • 顧客注文テーブル(CustomerOrders
    • OrderDate: 注文日時
    • CustomerID: 顧客ID
    • ProductID: 商品ID
  • 顧客情報テーブル(CustomerInformation
    • CustomerID: 顧客ID
    • Age: 年齢
  • 商品テーブル

CREATE OR REPLACE TABLE sample_data_canvas.Products (
    ProductID INT64,
    ProductName STRING,
    Price INT64
);

INSERT INTO sample_data_canvas.Products (ProductID, ProductName, Price) VALUES
(1, 'スマートフォン', 50000),
(2, 'ノートパソコン', 80000),
(3, 'テレビ', 70000),
(4, 'タブレット', 30000),
(5, 'デジタルカメラ', 40000);
  • 顧客注文テーブル
CREATE OR REPLACE TABLE sample_data_canvas.CustomerOrders (
    OrderDate DATE,
    CustomerID INT64,
    ProductID INT64,
);

INSERT INTO sample_data_canvas.CustomerOrders (OrderDate, CustomerID, ProductID)
SELECT
    DATE '2024-04-10' AS OrderDate,
    CAST(FLOOR(RAND() * 10) + 1 AS INT64) AS CustomerID,
    CAST(FLOOR(RAND() * 5) + 1 AS INT64) AS ProductID
FROM
    UNNEST(GENERATE_ARRAY(1, 100));
  • 顧客情報テーブル
CREATE TABLE sample_data_canvas.CustomerInformation (
    CustomerID INT64,
    Age INT64
);

INSERT INTO sample_data_canvas.CustomerInformation (CustomerID, Age)
SELECT
    CAST(customer_id AS INT64) AS CustomerID,
    CAST(FLOOR(RAND() * 50) + 20 AS INT64) AS Age
FROM
    UNNEST(GENERATE_ARRAY(1, 10)) AS customer_id;

試してみる

冒頭で説明した通り、まずは顧客注文テーブル(CustomerOrders)と商品テーブル(Products)を結合します。
まずは先程と同じようにCustomerOrdersのテーブルを検索し、キャンパスに追加しました。

続けて、結合するテーブルも追加します。
右下のからNew searchを選択します。

同様にProductsのテーブルを検索し、キャンパスに追加しました。
追加したらJOINを選択し、右テーブルの名前を選択します。

クエリを実行する画面に移動するので以下のクエリを入力し、実行しました。

SELECT
  t1.CustomerID,
  t1.OrderDate,
  t2.ProductID,
  t2.ProductName
FROM
  sample_data_canvas.CustomerOrders AS t1
LEFT JOIN
  sample_data_canvas.Products AS t2
ON
  t1.ProductID = t2.ProductID

結合できました!
結合されたテーブルは線が引かれていて、一目で把握できるようになっていました。

続けて、CustomerInformationのテーブルをキャンパスに追加し、結合します。
現時点での全体像は以下の通りです。

事前に結合した左のテーブルとCustomerInformationのテーブルを結合したかったのですが、左のテーブルのデータセット名とテーブル名を取得するのが困難(現時点ではデバック情報から探すしかなさそう?)でしたのでGeminiでクエリを生成し、結合させます。(おそらく今後のアップデートで改善されると予想されます。)
2つのテーブルをCustomerIDのカラムをキーに結合させたいのでPlace the CustomerInformation table to the right and join the tables using CustomerID as the keyと入力し、クエリを生成しました。

生成されたクエリは以下の通りです。
前回と同様に問題ないことを確認した上で実行しました。

SELECT
  t1.CustomerID,
  t1.OrderDate,
  t1.ProductID,
  t1.ProductName,
  t2.Age
FROM
  `<PROJECT_ID>._197dd1fcd7aad6e1234a7933d678881672ab3991.anon605b65055b201ae26d9865f478a9503ea160e8c8fa1f2c1bb4fcabbee4c53d46` AS t1
LEFT JOIN
  `<PROJECT_ID>.sample_data_canvas.CustomerInformation` AS t2
ON
  t1.CustomerID = t2.CustomerID

最終的に以下のようなテーブルが完成しました。

せっかくなので最後に商品毎の売上個数を円グラフで作成しました。

最終的なDAGは以下のようになりました。
やはり一目で全体の構成を把握できるのは便利だなと思いました。

仮にですが、この一連の流れを1つのクエリで表すと以下のようになります。

SELECT
  CP.CustomerID,
  CP.OrderDate,
  CP.ProductID,
  CP.ProductName,
  CI.Age
FROM
  (
    SELECT
      C.CustomerID,
      C.OrderDate,
      P.ProductID,
      P.ProductName
    FROM
      sample_data_canvas.CustomerOrders AS C
    LEFT JOIN
      sample_data_canvas.Products AS P
    ON
      C.ProductID = P.ProductID
  ) AS CP
LEFT JOIN
  sample_data_canvas.CustomerInformation AS CI
ON
  CP.CustomerID = CI.CustomerID

普段SQLを書いている人であれば問題ないと思いますが、テーブルが増えれば増えるほど全体の構成を把握するのが困難になります。
また、サブクエリや一時テーブルを活用し、クエリの可読性を高めることも可能ですが、同様にテーブルの数が増えれば困難になると思います。

全体の感想

この記事では、BigQuery data canvasを実際に触ってみました。
何度も言っていますが、全体の構成を容易に把握できるのは便利だなと思いました。

また、このサービスが今後どのユーザー向けにアップデートされていくのか非常に楽しみです。
データエンジニア向けにアップデートされていくのであれば、スケジュール機能やDAGをSQLで管理する構文などを追加してもらいたいなと思いました。

一方で以下のブログでは、データアナリスト向けの活用例などが紹介されているので是非参考にしてみてください!

今後のアップデートにも期待です!

また、Next'24の翌週に帰国したばかりの現地参加メンバーが振り返り勉強会を行いますので是非とも現地でご参加ください!