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にお世話になりましょう!!!
Author And Source
この問題について(BigQueryのテーブルの情報を一撃(?)で取ってみる。), 我々は、より多くの情報をここで見つけました https://qiita.com/satoru_mag/items/ae684f89b006d125efdf著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .