LoginSignup
11
11

More than 3 years have passed since last update.

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

Posted at

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;

実行してみてください。こんな感じでテーブルに入ってると思います。
スクリーンショット 2020-05-26 21.16.51.png
やり方次第では、複数のプロジェクトにまたがっても取れるかもですね。
ではまたBigQueryにお世話になりましょう!!!

11
11
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11