BigQueryにおけるデータ整合性チェックの代表的な方法とはGoogle Cloudチートシート(3)

Google Cloudを活用する上でのさまざまなコツを、できるだけ分かりやすく説明する連載「Google Cloudチートシート」。今回はBigQueryのテーブル間でのデータの一致をチェックする代表的な方法を紹介します。

» 2024年07月10日 05時00分 公開
[川口拓也ジーアイクラウド株式会社]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

 Google Cloudの代表的なサービスの一つにBigQueryがあります。高性能なデータウェアハウスサービスで 、PB(ペタバイト)級のデータを扱うことができます。とはいえ、大規模なデータを扱うことには課題も伴います。

 その一つはシステムの新規開発や追加開発、データ移行などにおけるデータの検証です。

 小規模なデータでは、カラム1個1個を検証していくこともできますが、大規模なデータではこれが時間的に難しくなります。従って、テーブルなどの単位で間違いのあるなしを判定していく必要があります。例えば以下のようなケースが考えられます。

  • システム連携時のデータ整合性検証
    シビアなデータ整合性が求められるアプリケーションの構築時に、アプリケーションでデータの整合性を検証し、保証する必要があります
  • システムを改修した時の現新比較
    リファクタリングなどを行った際の現新比較を行うケースです。アウトプットとなるデータが修正前後で変わっていないことの検証を行う必要があります
  • データの移行
    他のデータストアからデータを移行したとき、移行前後でデータが一致しているかどうかの検証を行う必要があります
  • データのリストアの検証
    バックアップデータおよびログからデータをリストアしたとき、想定通りのデータが復元できているかどうかの検証を行う必要があります

 このようなデータ検証は、システムの信頼性や品質を確保するために非常に重要です。データの不一致は、システムの誤動作やデータの損失につながる可能性があります。

 今回は膨大なデータがある場合でも対応できる、BigQueryのコンソール上のSQLエディタを使ったデータ比較の代表的な方法を紹介します。

比較演算子と集計関数を使う方法

比較方法

 比較したいテーブル同士のカラムレベルでの比較を行います。

 全ての列のデータを比較するのではなく、特定の列のデータを比較したいケースに適しています。複数列チェックを行う場合にはチェック列を追加することで対応できます。どの列にデータ差分があるのかが一目で判別できるため、全体の簡易的なチェックができます。

注意点

 データに `null` が含まれる場合は正しい結果を返しません。 `null = null` は偽と判断されるためです。

 下では、全体の行数と、比較した結果の一致件数を返しています。

SELECT 
  COUNT(*) AS total_rows, 
  SUM(CASE WHEN table1.column_name = table2.column_name THEN 1 ELSE 0 END) AS matching_rows 
FROM 
  table1 
    FULL OUTER JOIN 
  table2 
    ON table1.primary_key = table2.primary_key

チェックサムを使う方法

比較方法

 対象項目をハッシュ化し、排他的論理和でチェックサムを取得し、比較を行います。厳密なデータ一致チェックや異なるデータベース間でのデータ整合性を確認するケースに適しています。

注意点

 データ全体をハッシュ化すること、さらに排他的論理和を取るため、データ量によっては膨大な計算資源が必要になる場合があります。そのため、パーティションやクラスタ単位で処理を分割するなどの工夫が必要になってきます。

 BigQuery同士での比較例です。

 TO_JSON_STRINGでテーブル全体をJSON構造体に変換し、 FARM_FINGERPRINT( Fingerprint64でハッシュ化し、結果をINT64で戻すようにしたBigQueryの独自関数)でハッシュ化、結果をBIT_XORで排他的論理和を取っています。

 データが一致していれば同じ値が取得できます。

SELECT 
  BIT_XOR(FARM_FINGERPRINT(TO_JSON_STRING(table1))) AS checksum1,
  BIT_XOR(FARM_FINGERPRINT(TO_JSON_STRING(table2))) AS checksum2
FROM table1, table2

よくある疑問と回答

BigQueryと異なるデータベースを比較することは可能か?

 Google Cloud内においては直接的な比較が行えます。BigQueryには他のデータベースに直接 SQLを発行できる連携クエリの機能があります。

 データベースが異なっていても可能ですが、下記の点に注意する必要があります。これらについては事前に調査を行い、差分をどのように吸収するか定義しておかなければなりません。

  • `null` の扱われ方
  • データベースの文字コード
  • 日付の扱われ方
  • タイムゾーンの扱われ方
  • データベース固有のデータ型

データに `null` がある場合、 `null` をどのように変換すればよいか?

`null` をどのように変換するか、ということより、どのように扱うか定義することが重要です。その上で変換をするか、 `null` は省くかなどを決定してください。

BigQueryで比較すると料金が高くならないか?

 比較したいデータ量によります。費用の問題がある場合はチェックしたい範囲を厳密に定義し、不要な比較を行わないようにすることが重要です。例えば一部の列のみ一致していればよいケースで、テーブル全体を比較しないようにすることです。

チェックサム形式において不一致が発生した場合、不一致の原因となっている箇所の特定は可能か?

 特定はできません。確認できるのはデータ全体が一致しているかのみです。

参考リンク
BIT_XOR
Aggregate functions | BigQuery | Google Cloud
FARM_FINGERPRINT
Hash functions | BigQuery | Google Cloud
TO_JSON_STRING
JSON functions | BigQuery | Google Cloud

まとめ

 今回はBigQueryでのデータ比較を行う方法を紹介しました。比較演算子と集計関数を使う方法、チェックサムを使う方法、それぞれの特徴と注意点を押さえて適切な手法を選択することで、効率的かつ正確なデータ検証を行うことができます。

 データ検証はシステムの信頼性や品質を確保するために不可欠なプロセスです。BigQueryの強力な機能を活用し、データの整合性を保ち、安心してシステムを利用できる環境を構築しましょう。

Copyright © ITmedia, Inc. All Rights Reserved.

スポンサーからのお知らせPR

注目のテーマ

4AI by @IT - AIを作り、動かし、守り、生かす
Microsoft & Windows最前線2025
AI for エンジニアリング
ローコード/ノーコード セントラル by @IT - ITエンジニアがビジネスの中心で活躍する組織へ
Cloud Native Central by @IT - スケーラブルな能力を組織に
システム開発ノウハウ 【発注ナビ】PR
あなたにおすすめの記事PR

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。