Time travel and versioning let you see and use past versions of your data easily. This helps fix mistakes or compare changes over time.
Time travel and versioning in Apache Spark
spark.read.format("delta").option("versionAsOf", version_number).load(path) spark.read.format("delta").option("timestampAsOf", "yyyy-MM-dd HH:mm:ss").load(path)
Use versionAsOf to load data from a specific version number.
Use timestampAsOf to load data as it was at a specific time.
df = spark.read.format("delta").option("versionAsOf", 3).load("/data/delta/events")
df = spark.read.format("delta").option("timestampAsOf", "2024-04-01 10:00:00").load("/data/delta/events")
This program creates a Delta table with two versions of data. It then reads and shows the current data and the data from the first version using time travel.
from delta.tables import DeltaTable from pyspark.sql import SparkSession spark = SparkSession.builder.appName("TimeTravelExample").getOrCreate() # Path to Delta table path = "/tmp/delta/events" # Create initial data data_v1 = [(1, "login"), (2, "logout")] df_v1 = spark.createDataFrame(data_v1, ["user_id", "action"]) df_v1.write.format("delta").mode("overwrite").save(path) # Update data - add a new event data_v2 = [(1, "login"), (2, "logout"), (3, "purchase")] df_v2 = spark.createDataFrame(data_v2, ["user_id", "action"]) df_v2.write.format("delta").mode("overwrite").save(path) # Read current data current_df = spark.read.format("delta").load(path) print("Current data:") current_df.show() # Read data from version 1 (first save) version1_df = spark.read.format("delta").option("versionAsOf", 1).load(path) print("Data at version 1:") version1_df.show() spark.stop()
Time travel works only with Delta tables, not regular Parquet or CSV files.
Each save or write creates a new version automatically.
Older versions may be cleaned up if retention policies are applied, so keep backups if needed.
Time travel lets you access past versions of your Delta data easily.
Use versionAsOf or timestampAsOf options to load old data.
This helps with data recovery, auditing, and comparing changes over time.
Practice
Solution
Step 1: Understand time travel concept
Time travel allows users to look at past versions of data stored in Delta Lake.Step 2: Identify main use
This feature helps in recovering old data, auditing changes, and comparing versions.Final Answer:
To access previous versions of data easily -> Option AQuick Check:
Time travel = Access past data versions [OK]
- Thinking time travel speeds up processing
- Confusing time travel with data deletion
- Assuming it creates new tables automatically
Solution
Step 1: Recall correct option name for version
The correct option to specify version is 'versionAsOf'.Step 2: Check syntax correctness
spark.read.format('delta').option('versionAsOf', 5).load('/data/table') uses 'versionAsOf' with a number, which is correct syntax.Final Answer:
spark.read.format('delta').option('versionAsOf', 5).load('/data/table') -> Option BQuick Check:
Use 'versionAsOf' to load specific version [OK]
- Using 'version' instead of 'versionAsOf'
- Passing version as string in 'timestampAsOf'
- Using wrong option names like 'versionAt'
df = spark.read.format('delta').option('versionAsOf', 2).load('/data/events')
print(df.count())
Assuming version 2 of the table has 150 rows.Solution
Step 1: Understand versionAsOf usage
The option 'versionAsOf' loads the table exactly at version 2.Step 2: Check row count at version 2
Since version 2 has 150 rows, the count will be 150.Final Answer:
150 -> Option DQuick Check:
Count at version 2 = 150 [OK]
- Assuming count is zero for old versions
- Confusing latest count with versioned count
- Expecting error from correct syntax
df = spark.read.format('delta').option('timestampAsOf', 20230101).load('/data/sales')Solution
Step 1: Check timestampAsOf option usage
The 'timestampAsOf' option expects a string representing date and time, e.g., '2023-01-01T00:00:00'.Step 2: Identify error in value type
Here, 20230101 is an integer, not a string with proper format, causing error.Final Answer:
timestampAsOf value should be a string with date-time format -> Option CQuick Check:
timestampAsOf needs string date-time [OK]
- Passing integer instead of string for timestamp
- Confusing versionAsOf with timestampAsOf
- Assuming option does not exist
Solution
Step 1: Identify correct option for version number
The option 'versionAsOf' expects an integer version number, not a string.Step 2: Check code correctness for both versions
df_v3 = spark.read.format('delta').option('versionAsOf', 3).load('/data/logs') df_v5 = spark.read.format('delta').option('versionAsOf', 5).load('/data/logs') uses 'versionAsOf' with integers 3 and 5, correctly loading both versions.Final Answer:
df_v3 = spark.read.format('delta').option('versionAsOf', 3).load('/data/logs') df_v5 = spark.read.format('delta').option('versionAsOf', 5).load('/data/logs') -> Option AQuick Check:
Use 'versionAsOf' with integers for version loading [OK]
- Using timestampAsOf with integers
- Passing version numbers as strings
- Using non-existent 'version' option
Ready to prove it?
Pass the test and this pattern moves unknown
