Databricks Certified Data Engineer Professional 無料問題 3 / 10 ・ 分野2: Data Ingestion & Acquisition
JSON ファイルをスキーマを指定して読み、mode を DROPMALFORMED にし、rescuedDataColumn に "_rescued_data" を指定した。レコード A は INT の rating に "five" という文字列が入っている。レコード B は途中で切れていて、JSON として閉じていない。読み込みの結果で A と B はどう扱われるか。
- A も B も結果に残り、どちらの値も _rescued_data に入る
- A は結果に残って値が _rescued_data に入り、B は落とされる
- A も B も壊れたレコードとして、結果から落とされる
- A は落とされ、B は結果に残って本文が _rescued_data に入る
正解と解説を見る
正解: B
正解の理由
rescuedDataColumn を指定すると、スキーマに無い・スキーマの型と合わない・フィールド名の大文字小文字が違う、のどれかで解析されなかったデータが、救出列に JSON の形で入る。公式は、この列を DROPMALFORMED や FAILFAST と組み合わせたとき、型の不一致ではレコードは落とされず(FAILFAST でもエラーにならず)、落とされたりエラーになったりするのは不完全・不正な JSON(壊れたレコード)だけ、と定めている。A は型の不一致なので行は残り、"five" は _rescued_data に入る。B は閉じていない不完全な JSON なので、DROPMALFORMED で落とされる。
違う選択肢
「A も B も壊れたレコードとして、結果から落とされる」… 救出列を指定しないときの DROPMALFORMED の動きを当てはめたもの。救出列を使うと型の不一致は壊れたレコードに数えないので、A は落とされない。A まで落とすなら、救出列で値を拾う意味がなくなる。
「A は落とされ、B は結果に残って本文が _rescued_data に入る」… 向きが逆である。救出列が拾うのはスキーマとの食い違い(型・欠けた列・大文字小文字)で、JSON として壊れたレコードの本文を受ける列ではない。B は解析できないので、DROPMALFORMED で落とされる。
「A も B も結果に残り、どちらの値も _rescued_data に入る」… B のような不完全な JSON は救出の対象ではない。救出列を付けても、壊れたレコードの扱いは mode に従い、DROPMALFORMED なら落とされる。
押さえどころ
JSON の解析のモードは PERMISSIVE・DROPMALFORMED・FAILFAST の3つである。救出列にはレコードの元のファイルのパスも入り、spark.databricks.sql.rescuedDataColumn.filePath.enabled を false にすると外せる。
Databricks Certified Data Engineer Professionalの演習アプリ(無料10問・全問は解錠で)へ