代表的な面接トピック

データエンジニアリング面接:メトリクス定義、粒度、結合(Join)をどのようにガバナンスするか?

データ難しい
Offer.cc 編集チーム公開日 更新日

質問

レポート間でDAU、収益、コンバージョン率が一致していません。定義、エンティティの粒度、時間枠、結合をどのようにガバナンスし、二重計上を防ぎ、メトリクスを安全に移行しますか?

プロンプトとコンテキスト

DAU、収益、コンバージョン率がレポート間で一致していません。アナリスト、BI、アプリケーション、自動ジョブがメトリクス定義を共有できるように、ガバナンスされたセマンティックレイヤーを設計してください。

メトリクス規約(contracts)、エンティティの粒度、ディメンション、結合グラフ、時間セマンティクス、バージョン、パーミッション、キャッシュ、品質テスト、移行について説明してください。dbtやLookerを前提としないでください。これらは実装の選択肢であり、答えそのものではありません。この不整合は架空の演習シナリオです。

面接官がテストしていること

一貫した定義

コピーされた別のSQLクエリにするのではなく、メトリクス名を分子、分母、フィルター、時間枠、重複排除、デフォルトのディメンションに変換すること。

粒度と結合

ファクトテーブルの粒度を特定し、多対多の重複を防ぎ、セマンティックに合成できない組み合わせを拒絶すること。

ガバナンスと変更管理

定義には、バージョン管理、レビュー、非推奨化(deprecation)、互換性期間が必要です。BIユーザーが2つ目の信頼できる唯一の情報源(source of truth)を作成してはなりません。

ユーザビリティ

セマンティックレイヤーには、機械可読な規約と、オーナー、例、品質ステータスを備えた人間向けのドキュメントが必要です。

最初に明確にすべき質問

  • DAU、収益、コンバージョンは具体的に何を意味するのか?
  • コンシューマーが必要としているのは、SQL、API、BIエクスプローラー、それとも埋め込みチャートか?
  • ソースの粒度とタイムゾーンは何か?
  • 準リアルタイムの値と最終改訂値を共存させることができるか?
  • パーミッションはデータセット、行、列、ディメンションのどのレベルで設定されるか?
  • レガシーレポートはどのくらいの期間互換性を維持する必要があるか?

30秒の回答

「私なら、名前、説明、分子、分母、フィルター、時間粒度、タイムゾーン、エンティティ粒度、ディメンション、オーナー、機密度、品質ステータスを含むバージョン管理された規約を定義します。クエリエンジンは宣言された結合グラフを使用し、安全でない多対多や互換性のない粒度のパスを拒否します。

定義はバージョン管理内でレビューされ、旧バージョンおよび非推奨期間が設けられます。SQL APIとBIアダプターは、定義バージョンと鮮度を返します。テストでは、フィクスチャ、照合、重複結合、レイテンシ、パーミッション、履歴回帰をカバーします。」

ステップごとの詳細な回答

ステップ1: ユースケースの棚卸し

レポート、アラート、プロダクト、実験で必要とされるクエリ、レイテンシ、精度をリストアップします。すべてのSQLファイルを移行する前に、高価値な2〜3個のメトリクスをパイロット運用します。

ステップ2: 規約の作成

メトリクス名、ビジネス上の意味、メジャー、フィルター、時間枠、タイムゾーン、エンティティ、ディメンション、オーナー、機密度、バージョン、鮮度SLOを記録します。

ステップ3: 粒度と結合のモデリング

各モデルのプライマリキーと粒度を宣言します。カーディナリティと集計方向が安全な結合のみを許可し、多対多のパスは事前集計、ブリッジ、または拒否します。

ステップ4: 時間と改訂の処理

イベント時刻、処理時刻、タイムゾーン、遅延データ、最終改訂ルールを定義します。準リアルタイムの結果には、鮮度と最終ステータスを公開する必要があります。

ステップ5: リリースと認可

定義をバージョン管理に保存し、オーナーとデータ品質のレビュー後に公開します。データセット、行、列、ディメンションを認可し、機密メトリクスへのアクセスを監査します。旧バージョンの移行期限を設定します。

ステップ6: テストと提供

フィクスチャ、照合サンプル、重複結合チェック、鮮度、null、分布テストを使用します。バージョン、タイムゾーン、品質ステータスとともに、SQL、BI、または埋め込みAPIを通じて値を返します。

模範解答

「私ならDAUと収益をパイロット運用します。各定義には、分子、分母、フィルター、イベント時刻、タイムゾーン、エンティティ粒度、許可されたディメンション、オーナー、機密度、バージョン、鮮度を記録します。DAUはユーザーを重複排除するのかデバイスなのかを明記する必要があり、収益は認識基準、返金、税金を定義する必要があります。

このレイヤーはモデルの粒度と結合グラフを保持します。多対多のパスは事前集計されるか拒否されます。定義はGitでレビューされ、リリース前にテストされます。移行期間中は旧バージョンも引き続き利用可能であり、レスポンスにはバージョンと鮮度が含まれます。パーミッションはデータセットとディメンションをカバーし、アクセス監査を実施します。

検証には、照合サンプル、重複カウント、遅延データ、タイムゾーン、パーミッション、鮮度、履歴回帰が含まれます。すべてのSQLクエリを一度に書き直すのではなく、価値の高いレポートを最初に移行し、新旧の結果の違いを説明します。」

よくある間違い

  • 分子、分母、フィルターなしでメトリクス名のみを保存すること。
  • 幅広いテーブル(wide table)を使用して異なるファクトの粒度を隠蔽すること。
  • ファクトを重複させる任意の結合を許可すること。
  • イベント時刻、処理時刻、タイムゾーンを混同すること。
  • バージョン、オーナー、非推奨化、移行期間を省略すること。
  • 結果の照合や鮮度を確認せずに、クエリの成功のみをテストすること。
  • 機械可読な規約なしでBIプラグインのみを構築すること。
  • ダッシュボードのみを保護し、基盤となるディメンションやクエリ監査を保護しないこと。

フォローアップ質問

フォローアップ1: 収益の重複をどのように防ぎますか?

収益の粒度と一意キーを宣言し、結合前に対象エンティティに事前集計し、安全でない多対多パスを拒否し、既知の合計と照合します。

フォローアップ2: 定義の変更がダウンストリームのユーザーに悪影響を与えることはありますか?

新しいバージョンまたは互換性のあるフィールドを公開し、期限まで旧バージョンを維持し、レスポンスにバージョンを含め、オーナーとコンシューマーの承認を必須とします。

フォローアップ3: 準リアルタイム値と最終値はどのように共存できますか?

鮮度、ウォーターマーク、最終ステータスとともに値を返します。コンシューマーは、暫定的な値を最終的な財務データとして扱うのではなく、許容可能なレイテンシと改訂セマンティクスを選択します。

フォローアップ4: メトリクスをどのように認可しますか?

データセット、行、列、ディメンションのポリシーを最小権限の原則と組み合わせます。リクエスター、定義バージョン、エクスポートを記録し、定期的に監査します。

フォローアップ5: このレイヤーが価値を生み出していることをどのように証明しますか?

移行前後の定義の競合、重複SQL、照合の差異、クエリの成功率、鮮度、導入率、インシデントを比較するとともに、ユーザーが結果を説明できるかを確認します。

公開情報ソース

関連する質問