== Parsed Logical Plan ==
GlobalLimit 11
+- LocalLimit 11
+- Project [cast(userId#0L as string) AS userId#50, cast(movieId#1L as string) AS movieId#51, cast(rating#2 as string) AS rating#52, cast(timestamp_str#3L as string) AS timestamp_str#53, cast(date#39 as string) AS date#54]
+- 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
GlobalLimit 11
+- LocalLimit 11
+- Project [cast(userId#0L as string) AS userId#50, cast(movieId#1L as string) AS movieId#51, cast(rating#2 as string) AS rating#52, cast(timestamp_str#3L as string) AS timestamp_str#53, cast(date#39 as string) AS date#54]
+- 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#50, cast(movieId#1L as string) AS movieId#51, cast(rating#2 as string) AS rating#52, cast(timestamp_str#3L as string) AS timestamp_str#53, date#39]
+- 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#50,movieId#51,rating#52,timestamp_str#53,date#39])
+- *(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]