Skip to content

確認問題|Associate ③ データ変換・モデリング

教材 03-transformation.md の内容に基づく確認問題です(全10問)。 まず問題を解き、下の「解答・解説」で答え合わせをしてください。

問題

Q1. Spark の DataFrame 操作における「変換(transformation)」と「アクション(action)」・遅延評価(lazy evaluation)について、正しい説明はどれか。

  • A. select / filter / withColumn / groupBy は変換であり遅延評価される。count / collect / display / write などのアクションが呼ばれて初めて、それまでの変換がまとめて最適化・実行される
  • B. selectfilter は定義した時点で即座に計算が実行され、結果がメモリに保持される
  • C. countcollect は変換であり、DataFrame から新しい DataFrame を生成するだけで計算は起動しない
  • D. 遅延評価とは、アクションを定義しても実行されず、変換が呼ばれたときに初めてまとめて実行されるモデルである

Q2. 次の Auto Loader のコードについて、正しい説明はどれか。

python
(spark.readStream
  .format("cloudFiles")
  .option("cloudFiles.format", "json")
  .option("cloudFiles.schemaLocation", checkpoint_path)
  .load(file_path)
  .select("*", col("_metadata.file_path").alias("source_file"), current_timestamp().alias("processing_time"))
  .writeStream
  .option("checkpointLocation", checkpoint_path)
  .trigger(availableNow=True)
  .toTable(table_name))
  • A. format("cloudFiles") は Auto Loader を有効化し、cloudFiles.format で元データ形式を指定する。trigger(availableNow=True) は「今ある新規ファイルをまとめて処理して停止」する
  • B. checkpointLocation は不要なオプションで、指定しなくても増分処理の再開位置が自動的に保持される
  • C. select("*", ...)source_fileprocessing_time の 2 列のみを持つ DataFrame を返し、元データの列はすべて破棄される
  • D. trigger(availableNow=True) は新規ファイルが到着するたびに継続的に処理を実行し続け、停止しない

Q3. マネージドテーブル(managed table)と外部テーブル(external table)の違いについて、正しい説明はどれか。

  • A. マネージドテーブルを DROP するとメタデータとデータ本体の両方が削除されるが、外部テーブルを DROP してもデータ本体は残る。また外部テーブルは MERGE INTO のターゲットにできない
  • B. マネージドテーブルを DROP してもデータ本体は残るが、外部テーブルを DROP するとデータ本体も削除される
  • C. 外部テーブルはデータとメタデータの両方を Databricks が管理し、LOCATION を指定して作成する
  • D. マネージドテーブルは MERGE INTO のターゲットにできないが、外部テーブルはターゲットにできる

Q4. MERGE INTO の 3 つの WHEN 句の説明として、正しい組み合わせはどれか。

  • A. WHEN MATCHED は一致行を UPDATE / DELETE、WHEN NOT MATCHED [BY TARGET] はソースにあってターゲットにない行を INSERT、WHEN NOT MATCHED BY SOURCE はソースにないターゲット行を UPDATE / DELETE する
  • B. WHEN MATCHED は INSERT 専用、WHEN NOT MATCHED は UPDATE 専用、WHEN NOT MATCHED BY SOURCE は DELETE 専用である
  • C. WHEN NOT MATCHED [BY TARGET] はターゲットにあってソースにない行を削除する句である
  • D. WHEN NOT MATCHED BY SOURCE は新しいソース行をターゲットに挿入する句である

Q5. 教材が示す UDF の性能特性(速い順)として、正しいものはどれか。

  • A. 組み込み関数 / SQL UDF > Scala UDF > pandas UDF(Arrow でベクトル化)> 行ごとの Python UDF
  • B. 行ごとの Python UDF > pandas UDF > Scala UDF > 組み込み関数 / SQL UDF
  • C. pandas UDF > 組み込み関数 / SQL UDF > 行ごとの Python UDF > Scala UDF
  • D. Scala UDF > 行ごとの Python UDF > 組み込み関数 / SQL UDF > pandas UDF

Q6. 次の PySpark UDTF(ユーザー定義テーブル関数)のコードを実行したときの挙動として、正しいものはどれか。

python
from pyspark.sql.functions import lit, udtf

@udtf(returnType="sum: int, diff: int")
class GetSumDiff:
    def eval(self, x: int, y: int):
        yield x + y, x - y

GetSumDiff(lit(1), lit(2)).show()
  • A. 入力行ごとに sumdiff の 2 列を持つ行を返す。この例では sum=3, diff=-1 の行が出力される
  • B. 入力 2 行を集約して 1 つのスカラー値だけを返す UDAF として動作する
  • C. yield された値は無視され、sumdiff は常に NULL になる
  • D. スカラー UDF と同じく、1 行の入力に対して 1 つの列だけを返す

Q7. メダリオンアーキテクチャの Bronze / Silver / Gold 各層の役割について、正しい説明はどれか。

  • A. Bronze は生データを元の形式で最小限の検証で取り込み、Silver でクレンジング・検証・重複排除・結合を行い、Gold で集計・ディメンションモデリングを施す
  • B. Bronze で集計・ディメンションモデリングを行い、Gold で生データを未加工のまま取り込む
  • C. Silver は生データを一切変換せずそのまま保持する層で、検証や重複排除は Gold で初めて行う
  • D. Gold は Bronze より多くのデータセットを含み、すべての履歴データを未集計のまま保持する層である

Q8. ビュー(view)に関する説明として、正しいものはどれか。

  • A. TEMPORARY VIEW は作成したセッション内でのみ可視で、セッション終了時に削除される。CREATE OR REPLACE VIEW で置換すると元の権限は保持されない
  • B. ビューは物理データを持ち、DROP VIEW するとデータ本体も削除される
  • C. TEMPORARY VIEW はセッションをまたいで永続化され、他のユーザーからも参照できる
  • D. CREATE OR REPLACE VIEW はビューを置換しても、元のビューに付与されていた権限をすべて自動的に引き継ぐ

Q9. MERGE INTO の複数一致(multiple matches)と複数句の評価に関する説明として、正しいものはどれか。

  • A. ソースの複数行がターゲットの同一行に一致すると、(無条件の DELETE を除き)操作は失敗しエラーになる。CDC ではソースを前処理し各キーの最新変更のみを残して回避する
  • B. ソースの複数行が同一ターゲット行に一致した場合、Spark が自動的に任意の 1 行を選んで常に正常に更新する
  • C. WHEN MATCHED 句を複数書く場合、最初の句以外は条件(matched_condition)を持ってはならない
  • D. 複数の WHEN 句は評価順に関係なく並列に適用され、どの句が実行されるかは不定である

Q10. 次の MERGE INTO 文について、正しい説明はどれか。

sql
MERGE INTO target USING source
  ON target.key = source.key
  WHEN MATCHED AND target.updated_at < source.updated_at THEN UPDATE SET *
  WHEN NOT MATCHED THEN INSERT *
  • A. キーが一致し target.updated_at < source.updated_at の場合にソースの対応列でターゲット全列を更新し、キーが一致しないソース行は全列を挿入する。UPDATE SET * / INSERT * は列名が同じであることが前提
  • B. UPDATE SET * はターゲットとソースの列名が異なっていても、位置に基づいて自動的にマッピングして更新する
  • C. この文は外部テーブルをターゲットにしても問題なく動作し、MERGE INTO は Parquet テーブルでもサポートされる
  • D. WHEN NOT MATCHED THEN INSERT * は、ターゲットにあってソースにない行を挿入する

解答・解説

Q1. 正解: A 変換(select / filter / withColumn / join / groupBy など)は DataFrame から新しい DataFrame を作る操作で遅延評価され、この時点では計算は走らない。count / collect / display / write / toTable などのアクションが呼ばれて初めて、それまでの変換がまとめて最適化・実行される。B・C は変換とアクションが逆。D は「変換が呼ばれたとき実行」が誤りで、実行を起動するのはアクション。

Q2. 正解: Aformat("cloudFiles") で Auto Loader を有効化し、cloudFiles.format で元データ形式(json)を指定する。trigger(availableNow=True) は「今ある新規ファイルをまとめて処理して停止」する。B は誤りで checkpointLocation は処理位置を記録し増分再開に必須。C は誤りで select("*", ...) は全列に 2 列を追加する射影。D は継続実行の説明で availableNow の挙動と逆。

Q3. 正解: A マネージドテーブルは Databricks がデータとメタデータの両方を管理し、DROP でデータ本体も削除される。外部テーブルはデータ本体を外部の既存ストレージ場所(LOCATION)に置き、DROP してもデータ本体は残る。また外部テーブルは MERGE INTO のターゲットにできない。B は DROP 時の挙動が逆、C は管理主体が逆、D は MERGE ターゲット可否が逆。

Q4. 正解: AWHEN MATCHED はソース行がターゲット行に一致した場合に UPDATE / DELETE、WHEN NOT MATCHED [BY TARGET] はソース行がどのターゲット行にも一致しない場合に INSERT、WHEN NOT MATCHED BY SOURCE はターゲット行がソースのどの行にも一致しない場合に UPDATE / DELETE する。B・C・D は各句のアクションや対象を取り違えている。

Q5. 正解: A 教材の性能の目安(速い順)は「組み込み関数 / SQL UDF > Scala UDF > pandas UDF(Arrow でベクトル化)> 行ごとの Python UDF」。Python UDF はデータを JVM から Python インタープリターへシリアライズ移動するため低速だが、pandas UDF は Apache Arrow でシリアライズコストを削減し行ごとの Python UDF より最大 100 倍高速。

Q6. 正解: A UDTF は 1 つ以上の引数を受け取り、入力行ごとに複数行(複数列も可)を返す。returnType="sum: int, diff: int" により sumdiff の 2 列を返し、evalyield x + y, x - y するため入力 (1, 2) に対して sum=3, diff=-1 の行が出力される。B は UDAF(複数行→1集計値)の説明で誤り。C・D も UDTF の挙動と異なる。

Q7. 正解: A Bronze は生(未加工・未検証)データを元の形式で最小限の検証で取り込み、Silver はクレンジング・検証・重複排除・結合を行い消費しやすく整え、Gold は集計・ディメンションモデリングを施す。B は Bronze と Gold が逆、C は Silver の役割が誤り、D は「Gold は Silver / Bronze より含まれるデータセット数が少ない」ため誤り。

Q8. 正解: ATEMPORARY VIEW は作成したセッション内でのみ可視で、セッション終了時に削除される。CREATE OR REPLACE VIEW は同名ビューを置換するが、置換すると元の権限は保持されない。B はビューが物理データを持つとする点が誤り(ビューは物理データを持たない仮想テーブル)。C は一時ビューの有効範囲が誤り。D は権限を引き継ぐとする点が誤り。

Q9. 正解: AONWHEN MATCHED の条件により、ソースの複数行がターゲットの同一行に一致すると(どのソース行で更新すべきか曖昧なため)操作は失敗しエラーになる。ただし無条件の DELETE は曖昧でないため許可される。CDC ではソースを前処理し各キーの最新変更のみを残して回避する。C は誤りで、WHEN MATCHED を複数書く場合は「最後の句以外」が必ず条件を持つ必要がある。B・D も教材の記述と異なる。

Q10. 正解: A キーが一致し target.updated_at < source.updated_at の場合にソースの対応列でターゲット全列を条件付き更新(UPDATE SET *)し、どのターゲット行にも一致しないソース行は全列を挿入(INSERT *)する。UPDATE SET * / INSERT * は列名が同じであることが前提で、異なると分析エラーになる。B は列名一致が前提のため誤り。C は MERGE が Delta テーブル限定で外部テーブルはターゲット不可のため誤り。D は INSERT * の対象がソースにあってターゲットにない行のため誤り。