テーマ切替
確認問題|Associate ③ データ変換・モデリング
教材 03-transformation.md の内容に基づく確認問題です(全10問)。 まず問題を解き、下の「解答・解説」で答え合わせをしてください。
問題
Q1. Spark の DataFrame 操作における「変換(transformation)」と「アクション(action)」・遅延評価(lazy evaluation)について、正しい説明はどれか。
- A.
select/filter/withColumn/groupByは変換であり遅延評価される。count/collect/display/writeなどのアクションが呼ばれて初めて、それまでの変換がまとめて最適化・実行される - B.
selectやfilterは定義した時点で即座に計算が実行され、結果がメモリに保持される - C.
countやcollectは変換であり、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_fileとprocessing_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. 入力行ごとに
sumとdiffの 2 列を持つ行を返す。この例ではsum=3,diff=-1の行が出力される - B. 入力 2 行を集約して 1 つのスカラー値だけを返す UDAF として動作する
- C.
yieldされた値は無視され、sumとdiffは常に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" により sum と diff の 2 列を返し、eval が yield 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. 正解: AON と WHEN 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 * の対象がソースにあってターゲットにない行のため誤り。