#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にお世話になりましょう!!!