Snowflake SnowPro Advanced: Data Engineer (DEA-C02) · 27% practice allocation

Snowflake DEA-C02: Data Movement Practice Questions

5 free sample questions from the Data Movement domain, with answers and explanations. The full DEA-C02 bank has 262 questions across 5 domains. Questions are scenario-based and written from the official Snowflake exam guide.

1.

A data engineer needs to load a JSON file from an external S3 stage into a Snowflake table. The JSON file contains an array of objects at the top level. Which COPY INTO option should be used to instruct Snowflake to treat each element of the top-level array as a separate row during ingestion?

  • A. STRIP_OUTER_ARRAY = TRUE✓ Correct
  • B. TRIM_SPACE = TRUE
  • C. ENABLE_OCTAL = TRUE
  • D. STRIP_NULL_VALUES = TRUE
Explanation

STRIP_OUTER_ARRAY = TRUE tells the JSON parser to remove the outermost array brackets and load each array element as a separate row — this is the correct option for top-level JSON arrays. STRIP_NULL_VALUES removes null key-value pairs from JSON objects but does not affect array handling. ENABLE_OCTAL controls interpretation of octal numbers in JSON and is unrelated to array structure. TRIM_SPACE removes leading/trailing whitespace from string fields and has no effect on JSON array parsing.

2.

A data engineering team is implementing a Change Data Capture pipeline. They create a standard Stream on a source table and use a Task to consume it every 10 minutes. The task runs the following pattern:

INSERT INTO target_table
SELECT col1, col2, METADATA$ACTION
FROM my_stream
WHERE METADATA$ACTION = 'INSERT';

The team later realizes that UPDATE operations on the source table are not being correctly reflected in the target. Which TWO statements explain this behavior? (Select TWO)

  • A. Standard streams do not capture UPDATE operations at all; only INSERT and DELETE actions are tracked
  • B. The METADATA$ISUPDATE flag must be set to FALSE in the WHERE clause to correctly filter for true inserts versus update-inserts
  • C. Standard streams represent UPDATEs as a pair of rows: one DELETE row (METADATA$ACTION='DELETE', METADATA$ISUPDATE=TRUE) and one INSERT row (METADATA$ACTION='INSERT', METADATA$ISUPDATE=TRUE); the current WHERE clause discards the DELETE half but keeps the INSERT half✓ Correct
  • D. The WHERE clause filtering on METADATA$ACTION = 'INSERT' will miss the update's new-value row because updates are recorded only as METADATA$ACTION = 'UPDATE'
  • E. The task must use a MERGE statement instead of INSERT to correctly apply CDC changes including updates to the target table✓ Correct
Explanation

Option C is correct: in a standard stream, UPDATEs are represented as two rows — a DELETE row for the old value and an INSERT row for the new value, both with METADATA$ISUPDATE=TRUE. The current query keeps the INSERT half (new value) but discards the DELETE half, so the target will accumulate duplicate rows instead of updating them. Option E is correct: to properly apply CDC (handle inserts, update-new-values, and deletes), a MERGE statement matching on a primary key is required rather than a plain INSERT. Option A is false: standard streams DO capture updates, just as DELETE+INSERT pairs. Option D is false: there is no METADATA$ACTION = 'UPDATE' value; updates appear as DELETE and INSERT pairs. Option B is incorrect: filtering METADATA$ISUPDATE=FALSE would isolate true inserts from update-inserts, but the problem description is about updates not being reflected — this filter would make things worse, not better.

3.

A data engineering team is loading a large Parquet file from an external S3 stage into a Snowflake table. The file contains a column named event_payload stored as a Parquet nested struct. Which Snowflake COPY INTO behavior applies when loading this column into a VARIANT column in the target table?

  • A. Snowflake automatically converts the Parquet nested struct into a VARIANT value without any additional configuration.✓ Correct
  • B. The COPY INTO command requires a FORMAT_NAME clause referencing a named FILE FORMAT of type PARQUET before nested structs can be loaded.
  • C. Nested structs in Parquet files must be flattened using a SELECT transformation inside the COPY INTO statement before they can be stored in any column type.
  • D. Snowflake rejects nested structs from Parquet files by default and requires STRIP_OUTER_ARRAY = TRUE to enable loading.
Explanation

Correct (A): Snowflake natively understands Parquet's columnar format, including nested structs. When the target column is VARIANT, Snowflake automatically maps the nested struct to a VARIANT value during COPY INTO without any extra options. | Wrong (B): While a FILE FORMAT of type PARQUET is recommended and needed for Snowflake to parse the file, it does not require a FORMAT_NAME clause specifically—inline FORMAT options work too, and the automatic VARIANT conversion is not gated on using a named format. | Wrong (C): Flattening is not required. A SELECT transformation in COPY INTO can be used to reshape data but is not mandatory for loading nested Parquet structs into a VARIANT column. | Wrong (D): STRIP_OUTER_ARRAY = TRUE is a JSON-specific option used to remove the outer array wrapper in JSON documents; it has no applicability to Parquet files and Parquet nested structs are not 'rejected' by default.

4.

A data engineer is building a pipeline that loads CSV files from an external S3 stage. Some source files use a pipe character ('|') as the delimiter, have no header row, and wrap string fields in double quotes. Which COPY INTO statement correctly reflects these file format requirements?

  • A. COPY INTO my_table FROM @my_stage FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = '|' SKIP_HEADER = 1 FIELD_OPTIONALLY_ENCLOSED_BY = '"');
  • B. COPY INTO my_table FROM @my_stage FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = 'PIPE' SKIP_HEADER = 0);
  • C. COPY INTO my_table FROM @my_stage FILE_FORMAT = (TYPE = CSV COLUMN_SEPARATOR = '|' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = SINGLE_QUOTE);
  • D. COPY INTO my_table FROM @my_stage FILE_FORMAT = (TYPE = CSV FIELD_DELIMITER = '|' SKIP_HEADER = 0 FIELD_OPTIONALLY_ENCLOSED_BY = '"');✓ Correct
Explanation

Option D is correct: FIELD_DELIMITER = '|' specifies the pipe character, SKIP_HEADER = 0 means no header row is skipped (correct since there is no header), and FIELD_OPTIONALLY_ENCLOSED_BY = '"' handles double-quoted strings. Option A is wrong because SKIP_HEADER = 1 would skip the first data row, which is incorrect when there is no header. Option B is wrong because 'PIPE' is not a valid value for FIELD_DELIMITER — you must use the literal character. Option C is wrong because COLUMN_SEPARATOR is not a valid Snowflake CSV file format parameter (the correct parameter is FIELD_DELIMITER), and SINGLE_QUOTE is not valid syntax for FIELD_OPTIONALLY_ENCLOSED_BY.

5.

A data engineer is using the PUT command to upload a local file to a Snowflake internal stage. After the upload completes, the engineer runs LIST @my_stage and can see the file. However, when running COPY INTO my_table FROM @my_stage, no rows are loaded and the COPY history shows zero files processed. What is the MOST LIKELY explanation?

  • A. The file was uploaded to the stage but has already been marked as LOADED in the load history, and FORCE = TRUE was not specified.✓ Correct
  • B. The COPY INTO command requires the PURGE = TRUE option to be set before it can read newly uploaded files.
  • C. The COPY INTO command was run in a different Snowflake session from a different user, and internal named stages are session-scoped.
  • D. The PUT command compresses files by default using gzip, but the FILE_FORMAT specified in COPY INTO does not include COMPRESSION = GZIP.
Explanation

Option A is correct: Snowflake tracks loaded files in a 64-day metadata window. If the file was previously loaded (or if a file with the same name and checksum was loaded before), COPY INTO skips it by default. To reload such a file, the engineer must use FORCE = TRUE. This is a very common operational issue. Option C is incorrect: named internal stages are schema-level objects persisted in the Snowflake metadata layer, not session-scoped; any authorized user in any session can access and load from them after a PUT. Option D is a plausible distractor — PUT does compress files with gzip by default — but if the compression format were truly mismatched, COPY INTO would error out or produce a parsing failure, not silently process zero files. Option B is incorrect: PURGE = TRUE is an option that deletes staged files AFTER a successful load; it has no effect on whether COPY INTO reads newly uploaded files.

Test yourself across every DEA-C02 domain

The free DEA-C02 practice test mixes about 20 questions weighted like the exam. The full 262-question bank adds instant grading, flashcards and a timed mock exam.

Study this domain

Data Movement study guide (DEA-C02) →

Other DEA-C02 domains

← All Snowflake SnowPro Advanced: Data Engineer study resources