LoginSignup
0
1

More than 3 years have passed since last update.

Big Queryでデータセットのデータの総容量・総レコード数を出す方法

Posted at

今回はBigQuery上の「データセットの総容量と総レコード数を調べる方法」をご紹介します。

クエリ構文

今回使うクエリ元は以下の通りです。これらを少しいじっていきます。

①指定したテーブルの容量を出す

SELECT  
SUM(size_bytes)  / 1000000000 AS GBs
FROM Dataset.table

②指定されたテーブルの行数を出す

SELECT  
SUM(row_count) AS Rows
FROM `Dataset.table`

以上の二つで簡単にテーブルの容量と行数が出ます。

データセット全体の容量と総レコード数を算出する

データセット全体(Datasetsに含まれるテーブル全て)のサイズと行数を知りたいときは、「ワイルドカード」を使用すると簡単に調べる事ができます。

Dataset.table1、Dataset.table2、Dataset.table3、Dataset.table4・・・とテーブルが大量に存在するときは「*」を使うことで全てのテーブル指定できます。つまり、

Dataset.* = Dataset.table1、Dataset.table2、Dataset.table3、Dataset.table4・・・
となります。なので、

①指定したDatasetの容量を出す

SELECT  
SUM(size_bytes)  / 1000000000 AS GBs
FROM `Dataset.*`

②指定されたDatasetの行数を出す

SELECT  
SUM(row_count) AS Rows
FROM `Dataset.*`

となります。シンプルですね。ワイルドカード便利。

DatasetにViewが含まれている時は注意

先ほどのワイルドカードを使用したクエリ、実は弱点があります。それは、

「DatasetにViweが含まれる場合は、クエリはエラーを返す」です。

Google Cloudの公式にもあるように、

制限事項
ワイルドカード テーブルクエリには、次の制限が課されます。
ワイルドカード テーブルの機能はビューをサポートしません。ワイルドカード テーブルがデータセットのビューと一致すると、クエリはエラーを返します。クエリの WHERE 句に _TABLE_SUFFIX 擬似列を使用してフィルタを除外していても同様です。

どういう事でしょう。実験します。

Viewにワイルドカードを使えないとはどういう事か

今回はこの「Tableau」というデータセットで実験します。
1.png

二つのテーブルと二つのViewが入っています。

先ほどの記載の通りクエリを走らせようとすると・・・
2.png

走りませんね。エラーの通り、「*はViewを含む、テータセットでは使えません」とあります。

「View1」と「View2」が邪魔しているみたいです。

残念ながら、Viewを含むDatasetを調べる際には他の方法でやる必要があります。

メタテーブルを使ったクエリで解決する

ワイルドカードを使わない方法も勿論あります。さすがBig Query大先生。

それは「メタデータ」を使用するクエリです。こちらもGoogle Cloudのヘルプにあるように、

メタテーブルを使用する
BigQuery では、内容がメタデータ(テーブルの名前など)を表す特別なテーブルがいくつか提供されます。メタテーブルは読み取り専用です。通常、メタテーブルを使用するには SELECT ステートメントでメタテーブルを参照します。
メタテーブルは、クエリジョブだけでなく、tables.get や tabledata.list などの他の API オペレーションでも使用できます。メタテーブルは tables.insert をサポートせず、宛先テーブルとしては使用できません。また、テーブル デコレータもサポートしていません。 メタテーブルは、データセットの tables.list には表示されません。

データセット内のテーブルに関するメタデータ
データセット内のテーブルに関するメタデータには、TABLES または TABLES_SUMMARY メタテーブルを使用してアクセスできます。

つまり、

from Dataset.TABLES

とすることで、Dataset内にあるテーブルを全て指定することになります。
なので、

SELECT
SUM(size_bytes)  / 1000000000 AS GBs,
SUM(row_count) AS Records
FROM `Dataset.__TABLES__`

とすれば良さそうです。

実際にやってみた

実際に入力画面がこちら。エラー出ていませんね。
3.png
そして結果がこちら。
4.png

5.5GB、2億行でした。(適当なデータセットだったんですが、結構なボリューム)

まとめ

BigQuery上の「データセットの総容量と総レコード数を調べる方法」ですが、

  • データセットに含まれるのがテーブルのみならば、ワイルドカード(*)を使えば算出できる
  • Viewを含む場合はワイルドカードは使えず、「from Dataset.TABLES」を使う必要がある

でした。

0
1
0

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
0
1