SnowPro Advanced: MLOps Engineer 無料問題 2 / 10 ・ 分野1: Operationalize Data Preparation and Feature Engineering
Snowpark Python の特徴量のジョブは、特徴量を計算する前にその日のファイルを読み込むつもりで、次の行から始まっている。session.sql("copy into raw_events from @landing file_format=(type = csv)")。ジョブはエラー無しで終わるが、RAW_EVENTS に新しい行が入っていない。読み込みを実際に起こすための変更はどれか。
- 読み込みを、代わりに session.table("raw_events") で組む
- 同じ COPY 文で、session.sql をもう一度呼ぶ
- session.sql が返す DataFrame に対して collect() を呼ぶ
- session.sql がすぐに実行される Python ワークシートへ、このジョブを移す
正解と解説を見る
正解: C
正解の理由
「Executing SQL Statements」の節によると、session.sql は渡した文を受け取って DataFrame を返し、アクションのメソッドを呼ぶまでその SQL 文は実行されない。copy into の例を含め、ページの例はどれも collect() で終わっている。アクションの節がその理由を説明している。DataFrame は遅延評価され、collect・count・show・save_as_table のようなアクションだけが SQL をサーバーへ送る。この場面では DataFrame を作ってそのまま捨てたので、COPY は一度も走らず、エラーも出なかった。
違う選択肢
「読み込みを、代わりに session.table("raw_events") で組む」… session.table は既存のテーブルの上に DataFrame を作るもので、行を読むのであって、ステージのファイルをテーブルへコピーするものではない。それに、ほかの DataFrame と同じく、collect や count のようなアクションを実行するまでサーバーには何も送られない。
「同じ COPY 文で、session.sql をもう一度呼ぶ」… session.sql は呼ぶたびに新しい DataFrame を返し、そのどれもが同じように遅延評価される。2回呼んでも評価されていない DataFrame が2つできるだけで、COPY 文はやはりサーバーへ送られない。
「session.sql がすぐに実行される Python ワークシートへ、このジョブを移す」… ページの Python ワークシートの例でも collect() を呼んでおり、コメントには collect() の結果を返すには return を前に付けると書かれている。ワークシートはデータベースとスキーマの文脈を与えるが、文がいつ実行されるかは変えない。
結果を見ない文ほど危ない
この落とし穴に最もはまりやすいのは、COPY・CREATE STAGE・ALTER WAREHOUSE のように状態を変える文である。誰もその結果を見ないからである。ページの例と同じく、こうした呼び出しは collect() で終える習慣を付け、次の段がその文の成功を前提にするなら、返ってきた状態の行を確かめる。