== Parsed Logical Plan == GlobalLimit 11 +- LocalLimit 11 +- Project [cast(userId#0L as string) AS userId#28, cast(movieId#1L as string) AS movieId#29, cast(rating#2 as string) AS rating#30, cast(timestamp_str#3L as string) AS timestamp_str#31, cast(date#8 as string) AS date#32, cast(rating_category#15 as string) AS rating_category#33] +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, date#8, CASE WHEN ((rating#2 >= cast(0 as double)) AND (rating#2 < cast(1 as double))) THEN Very Low WHEN ((rating#2 >= cast(1 as double)) AND (rating#2 <= cast(2 as double))) THEN Low WHEN ((rating#2 >= cast(3 as double)) AND (rating#2 <= cast(4 as double))) THEN Medium WHEN ((rating#2 > cast(4 as double)) AND (rating#2 <= cast(5 as double))) THEN High END AS rating_category#15] +- Sort [date#8 ASC NULLS FIRST], true +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, from_unixtime(timestamp_str#3L, yyyy-MM-dd, Some(GMT)) AS date#8] +- LogicalRDD [userId#0L, movieId#1L, rating#2, timestamp_str#3L], false == Analyzed Logical Plan == userId: string, movieId: string, rating: string, timestamp_str: string, date: string, rating_category: string GlobalLimit 11 +- LocalLimit 11 +- Project [cast(userId#0L as string) AS userId#28, cast(movieId#1L as string) AS movieId#29, cast(rating#2 as string) AS rating#30, cast(timestamp_str#3L as string) AS timestamp_str#31, cast(date#8 as string) AS date#32, cast(rating_category#15 as string) AS rating_category#33] +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, date#8, CASE WHEN ((rating#2 >= cast(0 as double)) AND (rating#2 < cast(1 as double))) THEN Very Low WHEN ((rating#2 >= cast(1 as double)) AND (rating#2 <= cast(2 as double))) THEN Low WHEN ((rating#2 >= cast(3 as double)) AND (rating#2 <= cast(4 as double))) THEN Medium WHEN ((rating#2 > cast(4 as double)) AND (rating#2 <= cast(5 as double))) THEN High END AS rating_category#15] +- Sort [date#8 ASC NULLS FIRST], true +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, from_unixtime(timestamp_str#3L, yyyy-MM-dd, Some(GMT)) AS date#8] +- LogicalRDD [userId#0L, movieId#1L, rating#2, timestamp_str#3L], false == Optimized Logical Plan == GlobalLimit 11 +- LocalLimit 11 +- Project [cast(userId#0L as string) AS userId#28, cast(movieId#1L as string) AS movieId#29, cast(rating#2 as string) AS rating#30, cast(timestamp_str#3L as string) AS timestamp_str#31, date#8, CASE WHEN ((rating#2 >= 0.0) AND (rating#2 < 1.0)) THEN Very Low WHEN ((rating#2 >= 1.0) AND (rating#2 <= 2.0)) THEN Low WHEN ((rating#2 >= 3.0) AND (rating#2 <= 4.0)) THEN Medium WHEN ((rating#2 > 4.0) AND (rating#2 <= 5.0)) THEN High END AS rating_category#33] +- Sort [date#8 ASC NULLS FIRST], true +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, from_unixtime(timestamp_str#3L, yyyy-MM-dd, Some(GMT)) AS date#8] +- LogicalRDD [userId#0L, movieId#1L, rating#2, timestamp_str#3L], false == Physical Plan == TakeOrderedAndProject(limit=11, orderBy=[date#8 ASC NULLS FIRST], output=[userId#28,movieId#29,rating#30,timestamp_str#31,date#8,rating_category#33]) +- *(1) Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, from_unixtime(timestamp_str#3L, yyyy-MM-dd, Some(GMT)) AS date#8] +- *(1) Scan ExistingRDD[userId#0L,movieId#1L,rating#2,timestamp_str#3L]