Watermarking helps us handle data that arrives late in streaming. It tells the system how long to wait for late data before processing.
Watermarking for late data in Apache Spark
streamingDF.withWatermark("eventTime", "delayThreshold")
eventTime is the column with event timestamps.
delayThreshold is how long to wait for late data, e.g., "10 minutes".
streamingDF.withWatermark("timestamp", "5 minutes")
streamingDF.withWatermark("event_time", "1 hour")
This example shows how to add a watermark of 5 minutes on the eventTime column. It groups events into 5-minute windows and counts them. Late events arriving after 5 minutes will be ignored in aggregation.
from pyspark.sql import SparkSession from pyspark.sql.functions import window, col spark = SparkSession.builder.appName("WatermarkExample").getOrCreate() # Sample streaming data simulating events with timestamps input_data = [ ("2024-06-01 10:00:00", "event1"), ("2024-06-01 10:02:00", "event2"), ("2024-06-01 10:07:00", "event3"), # Late event ] # Create DataFrame with schema schema = "eventTime STRING, event STRING" staticDF = spark.createDataFrame(input_data, schema) # Convert eventTime to timestamp type streamingDF = staticDF.withColumn("eventTime", col("eventTime").cast("timestamp")) # Simulate streaming by using staticDF as streaming source (for example only) # In real use, streamingDF would come from a streaming source like Kafka # Apply watermark of 5 minutes on eventTime watermarkedDF = streamingDF.withWatermark("eventTime", "5 minutes") # Group events by 5-minute windows aggDF = watermarkedDF.groupBy(window(col("eventTime"), "5 minutes")).count() # Show the aggregation result aggDF.show(truncate=False) spark.stop()
Watermarking only works with event time columns of timestamp type.
Late data arriving after the watermark delay is dropped from aggregations.
Choosing the right delay threshold balances accuracy and latency.
Watermarking helps handle late data in streaming by setting a wait time.
Use with event time columns to group or aggregate streaming data.
Late data beyond the watermark is ignored to keep results timely.
Practice
Solution
Step 1: Understand watermarking concept
Watermarking sets a time limit to wait for late data in streaming.Step 2: Identify purpose in streaming
It helps to ignore data that arrives too late to keep results timely.Final Answer:
To handle late data by setting a threshold time for event processing -> Option AQuick Check:
Watermarking = handle late data [OK]
- Thinking watermark speeds up jobs by skipping all data
- Confusing watermark with data storage
- Assuming watermark converts batch to streaming
df with event time column eventTime and delay threshold of 10 minutes?Solution
Step 1: Recall correct method signature
The method iswithWatermarkwith two string arguments: column name and delay duration.Step 2: Match correct syntax
df.withWatermark("eventTime", "10 minutes") uses correct method and string format for delay "10 minutes".Final Answer:
df.withWatermark("eventTime", "10 minutes") -> Option BQuick Check:
Correct syntax uses strings for both args [OK]
- Passing column name without quotes
- Using integer instead of string for delay
- Using wrong method name like watermark()
val streamingDF = spark.readStream.format("csv")
.option("header", "true")
.load("/data/events")
val withWatermarkDF = streamingDF.withWatermark("eventTime", "5 minutes")
withWatermarkDF.printSchema()Solution
Step 1: Understand watermark effect on schema
Watermark adds metadata to the event time column, which must be timestamp type.Step 2: Check expected schema output
Schema shows eventTime as timestamp with watermark metadata.Final Answer:
eventTime: timestamp (nullable = true) with watermark -> Option AQuick Check:
Watermark adds metadata to timestamp column [OK]
- Assuming eventTime remains string type
- Thinking watermark changes nullability
- Believing watermark does not affect schema
val df = spark.readStream.format("json")
.load("/stream/data")
val result = df.withWatermark("timestamp", "1 minute")
.groupBy(window(col("timestamp"), "30 seconds"))
.count()Solution
Step 1: Check watermark and window durations
Watermark delay must be shorter than window duration to ensure the query emits results.Step 2: Compare durations in code
Watermark is 1 minute but window is 30 seconds, watermark delay longer than window duration and causes error.Final Answer:
Watermark delay must be shorter than window duration -> Option DQuick Check:
Watermark < window duration [OK]
- Assuming any column name works
- Thinking window duration cannot be "30 seconds"
- Calling withWatermark after groupBy
Solution
Step 1: Understand watermark delay role
Watermark delay should cover the maximum expected lateness of data to include late events.Step 2: Match delay to late data arrival
Since late data can arrive up to 15 minutes late, watermark delay must be at least 15 minutes.Step 3: Avoid setting delay too short or too long
Setting delay less than 15 minutes risks dropping late data; too long delays output.Final Answer:
"15 minutes" -> Option CQuick Check:
Watermark delay = max late arrival [OK]
- Setting delay equal to window size instead of late arrival
- Using shorter delay than late data time
- Using unnecessarily long delay causing latency
Ready to prove it?
Pass the test and this pattern moves unknown
