== Parsed Logical Plan == GlobalLimit 11 +- LocalLimit 11 +- Project [cast(userId#0L as string) AS userId#80, cast(movieId#1L as string) AS movieId#81, cast(rating#2 as string) AS rating#82, cast(timestamp_str#3L as string) AS timestamp_str#83, cast(date#39 as string) AS date#84, cast(rating_category#67 as string) AS rating_category#85] +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, date#39, 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(5 as double)) THEN High END AS rating_category#67] +- Sort [date#39 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#39] +- 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#80, cast(movieId#1L as string) AS movieId#81, cast(rating#2 as string) AS rating#82, cast(timestamp_str#3L as string) AS timestamp_str#83, cast(date#39 as string) AS date#84, cast(rating_category#67 as string) AS rating_category#85] +- Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, date#39, 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(5 as double)) THEN High END AS rating_category#67] +- Sort [date#39 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#39] +- 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#80, cast(movieId#1L as string) AS movieId#81, cast(rating#2 as string) AS rating#82, cast(timestamp_str#3L as string) AS timestamp_str#83, date#39, 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 = 5.0) THEN High END AS rating_category#85] +- Sort [date#39 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#39] +- LogicalRDD [userId#0L, movieId#1L, rating#2, timestamp_str#3L], false == Physical Plan == TakeOrderedAndProject(limit=11, orderBy=[date#39 ASC NULLS FIRST], output=[userId#80,movieId#81,rating#82,timestamp_str#83,date#39,rating_category#85]) +- *(1) Project [userId#0L, movieId#1L, rating#2, timestamp_str#3L, from_unixtime(timestamp_str#3L, yyyy-MM-dd, Some(GMT)) AS date#39] +- *(1) Scan ExistingRDD[userId#0L,movieId#1L,rating#2,timestamp_str#3L]