データエンジニア面接では、SQL、データパイプラインの設計・運用方法、そしてスケールと障害への対処法という3つの領域が問われます。以下では、候補者が通常出会う順番に沿って、応用できる回答付きの20問を紹介します。SQLの例は公開前に小規模なサンプルデータベースで実行し、示している結果は実際の出力です。
SQLに関する質問
1. 各企業または全体で2番目に高い給与を求めよ
DENSE_RANKを使います。同額は同じ順位を共有し、「2番目に高い」は2番目に異なる値を意味します。
SELECT name, salary
FROM (
SELECT name, salary, DENSE_RANK() OVER (ORDER BY salary DESC) AS r
FROM employees
) t
WHERE r = 2;
給与が150、130、130、110、90、70のテーブルでは、130を受け取っている2人を返します。なぜRANK(同額の後に順位を飛ばす)やROW_NUMBER(同額を恣意的に区別する)ではなくDENSE_RANKを選んだのかを説明しましょう。
2. 各部署の上位2名の稼得者
SELECT dept, name, salary
FROM (
SELECT dept, name, salary,
RANK() OVER (PARTITION BY dept ORDER BY salary DESC) AS r
FROM employees
) t
WHERE r <= 2;
PARTITION BYは部署ごとにランキングをリセットします。RANKでは同額の給与がある場合、2行を超える結果が返る可能性があることに触れましょう。
3. 顧客ごとの累計
SELECT customer, order_date, amount,
SUM(amount) OVER (PARTITION BY customer ORDER BY order_date) AS running_total
FROM orders;
日付が増加する順に10、20、30の注文がある顧客の場合、累計は10、30、60となります。
4. 重複行を削除し、最初の行を残せ
SELECT id, user_id
FROM (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY id) AS rn
FROM events
) t
WHERE rn = 1;
ここではROW_NUMBERが適切です。グループごとに正確に1行が欲しいからです。実際のテーブルでどの重複を残すかをどう判断するか(最新のタイムスタンプ、最も完全なレコード)を答えられるようにしておきましょう。
5. 前の行からの変化
SELECT order_date, amount,
amount - LAG(amount) OVER (ORDER BY order_date) AS change
FROM orders
WHERE customer = 'A';
最初の行の変化はNULLです。前の行が存在しないからです。これはよくある追加質問なので、声に出して説明しましょう。
6. WHEREとHAVINGの違いは何か?
WHEREはグループ化の前に行をフィルタリングし、HAVINGは集計後にグループをフィルタリングします。COUNT(*)のような集計関数をWHEREで使うことはできません。
7. 遅いクエリを高速化するにはどうするか?
- 何かを変更する前にクエリプランを確認する。
- フィルタがインデックスを使えるか、列に対する関数がそれを妨げていないかを確認する。
- スキャンするデータを減らす。必要な列だけを選択し、早い段階でフィルタリングし、大きなテーブルは日付でパーティション分割する。
- 繰り返されるサブクエリを結合や共通テーブル式に置き換え、結合で意図しない行の増殖がないか確認する。
- ウェアハウスの場合、クラスタリングやソートキー、各クエリが読み取るデータ量を確認する。
パイプライン設計に関する質問
8. ETLかELTか?
ETLはロード前にデータを変換します。ELTは先に生データをロードし、ウェアハウス内で変換します。ELTはクラウドウェアハウスで一般的です。ストレージが安く、生データが再処理のために利用可能なままで、変換をSQLとしてバージョン管理できるからです。ETLは、データが着地する前にクリーン化やマスキングが必要な場合、たとえば個人データを削除する場合には依然として理にかなっています。
9. バッチかストリーミングか?
データがどれだけ新鮮である必要があるかで選びます。バッチはよりシンプルで安価であり、日次レポートに適しています。ストリーミングは、不正検知やライブダッシュボードのように分や秒が重要となるケースに適しています。多くのシステムは両方を使います。技術だけでなく、ビジネス上の意思決定が何であるかを述べましょう。
10. 冪等なパイプラインとは何か、なぜ重要か?
2回実行しても1回実行した場合と同じ結果を生み出します。ジョブは失敗して再試行されるため重要です。ロードを冪等にするには、パーティションごとに書き込んでそのパーティションを上書きするか、安定したキーでupsertを使い、再試行で重複が生じないようにします。
11. 遅延データや順序が乱れたデータをどう扱うか?
到着時刻ではなくイベント時刻を使い、データがどれだけ遅れて到着し得るかを定義します。ストリーミングシステムでは、ウォーターマークがウィンドウを閉じる前にどれだけ待つかをジョブに伝えます。バッチテーブルでは、最近のパーティションをスケジュールに従って再処理するか、影響を受けた日を書き換える修正プロセスを維持します。
12. 障害と再試行のためにどう設計するか?
ステップを小さく、冪等に、独立して再実行可能にします。状態をジョブの外部に保存します。エラーだけでなく、データの欠落や遅延についてもアラートを出します。再試行に上限を設け、繰り返し失敗するものは人が確認する場所に送ります。
13. データ品質をどうチェックするか?
| チェック | 例 |
|---|---|
| 完全性 | 行数が許容範囲内でソースと一致する |
| 一意性 | 主キーに重複がない |
| 妥当性 | 値が期待される範囲または集合に収まる |
| 鮮度 | 最新のタイムスタンプが十分に新しい |
| 整合性 | 関連テーブル間で合計が一致する |
パイプライン内でチェックを実行し、早い段階で失敗させて、悪いデータがレポートに到達しないようにします。
モデリングとストレージに関する質問
14. スタースキーマとは何ですか?
中央のファクトテーブルには、注文などの測定可能なイベントが格納され、顧客、製品、日付など、それらを説明するディメンションテーブルにリンクします。クエリが簡単で、集計が高速です。スノーフレークスキーマはディメンションをさらに正規化するため、容量は節約できますが、結合が増えます。
15. 緩やかに変化するディメンションとは何ですか?
顧客の住所など、時間の経過とともに変化するディメンション属性のことです。タイプ1は古い値を上書きし、履歴を失います。タイプ2は開始日と終了日を持つ新しい行を追加するため、履歴が保持されます。どの属性にどちらを選ぶか、その理由を説明しましょう。
16. 大きなテーブルをどのようにパーティション分割しますか?
ほとんどのクエリがフィルタリングに使う列、通常は日付でパーティション分割します。その列でフィルタリングするクエリは、一致するパーティションだけを読み取ります。異なる値が多すぎる列は避けましょう。膨大な数の小さなパーティションが作成されてしまいます。
17. 分析にはどのファイル形式を使いますか?その理由は?
Parquetなどの列指向形式は各列をまとめて格納するため、少数の列だけを読み取るクエリは残りをスキップでき、圧縮効率も良くなります。CSVやJSONなどの行指向形式は生成と読み取りが簡単ですが、大規模になると遅く、サイズも大きくなります。
分散処理に関する質問
18. Sparkにおけるシャッフルとは何ですか?なぜ高コストなのですか?
シャッフルとは、結合やグループ化のように、同じキーを持つ行が同じ場所に集まるようにマシン間でデータを移動することです。ネットワーク転送、ディスク書き込み、ソートのコストがかかります。これを減らすには、早い段階でフィルタリングし、適切なパーティション数を選び、結合で小さなテーブルをブロードキャストして大きなテーブルを移動させないようにします。
19. データスキューにはどう対処しますか?
スキューとは、少数のキーがほとんどのデータを保持している状態で、1つのタスクが他よりもはるかに長く実行されます。対処法としては、ホットキーにランダムなサフィックスを付けてソルティングし2回集計する、結合の小さい側をブロードキャストする、ホットキーを別途フィルタリングまたは処理する、などがあります。
20. Airflowのようなオーケストレーターは何をしますか?
タスクを順番にスケジュールして実行します。各タスクが他のタスクに依存する有向グラフとして定義されます。リトライ、バックフィル、アラートを処理し、何が実行され何が失敗したかを表示します。作業を調整するものです。それ自体が重い処理を行うためのものではなく、重い処理はウェアハウスや処理エンジンで実行すべきです。
準備の方法
- 上のウィンドウ関数のパターンを、見ずに書けるようになるまで練習しましょう。
- 自分が構築したパイプラインを1つ用意し、データ量、遭遇した障害、変更した点をまとめましょう。
- ホワイトボードに簡単なアーキテクチャを描き、あるステップが失敗したときに何が起こるかを説明できるようにしましょう。
- 履歴書を見直しましょう。そこに載っているツールはすべて質問される可能性があります。
関連する練習には、Kafka面接質問、Databricks面接質問、Snowflake面接質問、システムデザイン面接質問のガイドをご覧ください。
声に出して、自分の言葉で練習しましょう。後で文字起こしを見ると、どこで話が脱線したり要点を外したりしたかがわかります。ライブ面接や評価では、AIツールに関する雇用主のルールに従ってください。
YesToTheOfferで回答を練習しましょう
声に出してリハーサルし、自分の履歴書に基づいた回答を生成し、後で文字起こしを確認できます。30分無料、サブスクリプション不要。



