情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

【BigQuery】テーブルの行数を調べる3つの方法

Google (152) Google BigQuery (2) Google Cloud Platform (1)

BigQueryを使い始めて、fluentdの設定を変更しながら、ちゃんとBigQuery側のテーブルに保存されているのかを、ひとまずテーブルの行数で確認していました。

その確認には、ウェブUI上の「Table Details」にある「Number of Rows」を使っていたのですが、この行数が120という表示からさっぱり増えなくなってしまいました。

しかし、試行錯誤していると、テーブルの「Preview」では、データが変わっており(ちゃんと保存されており)、行数が増えていないわけではなさそうでした。

そこで、他に行数を調べる方法にはどんな方法があるのだろう、と調べてみたのでメモしておきます。

関連:アクセスログをGoogle BigQueryで分析する環境構築の手順(Nginx+fluentd+BigQuery)

ウェブUIの「Number of Rows」で確認する方法

Google BigQueryのコンソールを開いて、テーブルを選択して表示される「Table Details: テーブル名」画面には、「Schema」「Details」「Preview」があります。

そこで「Details」を選択すると、「Table Info」の中にある「Number of Rows」に、テーブルの行数が表示されます。

ただ、この数値がさっぱり増えず、動作確認がろくにできませんでした。一方で、「Preview」タブは更新されており、よく分かりませんでした。

「bq show」コマンドを使う

そこでいろいろTableの状態を探ろうとした中で、インストールしておいたGoogle Cloud Platform SDKのbqコマンドで「$ bq show データセット名.テーブル名」と実行することで、次の出力を得られることが分かりました。

  • Last modified
  • Schema
  • Total Rows
  • Total Bytes
  • Expiration
  • Labels

この「Total Bytes」が、そのテーブルの行数です。

参考:bq コマンドライン ツール | BigQuery のドキュメント  | Google Cloud Platform

ただこの行数も、次に紹介する方法に比べると古い(こちらを後から実行しても数値が古い)、キャッシュされた値のようで微妙でした。

SQL「SELECT COUNT(*)」で数える

ここまで、一番素直な「SELECT COUNT(*) FROM データセット名.テーブル名」というSQLを実行する、という選択肢が出てきていなかったのは、SQLを実行すると料金がかかるという大ざっぱな認識があったからでした(実際Google検索して出てきたサイトに、料金が気にならなければ、と書かれていたので余計に)

料金は基本的に、読み出す列のデータサイズに依存するので・・・とざっくり思っていたのですが、よくよく考えると「COUNT(*)」自体はどの列のデータも読み出そうとはしておらず、結局「0バイトをたくさん読み出しているだけ」という認識で良い、と分かったのです。

クエリ料金の説明ページにも、サンプルとして「SELECT COUNT(*) FROM publicdata:samples.shakespeare;」というクエリについて、「処理されるバイトはありません」としていました。つまり、無料、のはずです

実際に次のクエリを実行してみました。

SELECT COUNT(*) FROM [project-id:dataset-name.table-name] LIMIT 1000;

すると当然行数が得られるわけですが、そのJobの「Job Information」を確認してみると、「Bytes Processed 0B」「Bytes Billed 0B」となっており、料金がかかるデータの読み出しが行われていないことが確認できました

また、得られる行数のデータも最も新しく、この方法が最も優秀そうでした。

コマンドラインから実行するには

コマンドラインからSQLを実行するには、「$ bq query ...」とすればよいので、「$ bq query "select count(*) from ..."」とすればOKです。

結論

というわけなので、結局のところ行数が知りたければ素直に「SELECT COUNT(*)」するのがよい、ということが分かりました。

コメント(0)

新しいコメントを投稿