BigQueryのテーブルの情報を一撃(?)で取ってみる。


BigQuery10歳おめでとう!!!!

めでたいです。10年ですよ。いつもお世話になっています。

BigQueryのテーブル情報取るのメンドイ

正直面倒くさいですよね。データセット単位でしか取れないですし。
execute IMMEDIATE を使いたかっただけなんですけどね。ご飯が炊けるまでにちょっと作ってみました。

まずはテーブルを作る

結果を格納するテーブルを作りましょう。
野良データセットや野良テーブル探しや、データの増量を毎日見たい場合を想定して、テーブルはパーティションしています。

create table `satoluxx-gde.table_check.table_meta` 
/*
↑このあたりは自分の環境にあわせてね。
*/
partition by date(check_timestamp)
as
SELECT
  *,
  current_timestamp as check_timestamp
FROM
  `satoluxx-gde.biengine_tutorial.__TABLES__` 
/*
↑このあたりは自分の環境にあわせてね。
*/
WHERE
  1 < 0

スクリプト回す

下記のようなスクリプトを回します。エラー処理もなんにもしていないので、実運用のときは色々改造して使ってやってください。
ちなみにロケーションが混在しているとそこでコケちゃうので、 locのところでデータセットのロケーションを指定してやってください。もちろん、実行するときも同じロケーションじゃないとダメです。

DECLARE dataset STRING;
DECLARE x int64 DEFAULT 0;
DECLARE loc STRING;

SET loc = 'US';
CREATE temp table dataset_list AS (
  SELECT
    catalog_name || '.' || schema_name || '.__TABLES__' AS dataset_name,
    ROW_NUMBER() OVER (ORDER BY schema_name) AS row_num
  FROM
    INFORMATION_SCHEMA.SCHEMATA
  WHERE
    location = loc);
LOOP
  SET
    x = x + 1;
  SET
    dataset = (
    SELECT
      dataset_name
    FROM
      dataset_list
    WHERE
      row_num = x);
  IF
    dataset IS NULL THEN
  LEAVE;
  END IF;
  EXECUTE IMMEDIATE FORMAT("INSERT INTO `satoluxx-gde.table_check.table_meta` SELECT *,current_timestamp() as check_timestamp FROM `%s`", dataset);
/*
↑このあたりは自分の環境にあわせてね。
*/
END LOOP;

実行してみてください。こんな感じでテーブルに入ってると思います。

やり方次第では、複数のプロジェクトにまたがっても取れるかもですね。
ではまたBigQueryにお世話になりましょう!!!