@@ -291,6 +291,22 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
291291 object BasicOperators extends Strategy {
292292 def numPartitions : Int = self.numPartitions
293293
294+ /**
295+ * Picks an appropriate sort operator.
296+ *
297+ * @param global when true performs a global sort of all partitions by shuffling the data first
298+ * if necessary.
299+ */
300+ def getSortOperator (sortExprs : Seq [SortOrder ], global : Boolean , child : SparkPlan ): SparkPlan = {
301+ if (sqlContext.conf.unsafeEnabled && UnsafeRowConverter .supportsSchema(child.schema)) {
302+ execution.UnsafeExternalSort (sortExprs, global, child)
303+ } else if (sqlContext.conf.externalSortEnabled) {
304+ execution.ExternalSort (sortExprs, global, child)
305+ } else {
306+ execution.Sort (sortExprs, global, child)
307+ }
308+ }
309+
294310 def apply (plan : LogicalPlan ): Seq [SparkPlan ] = plan match {
295311 case r : RunnableCommand => ExecutedCommand (r) :: Nil
296312
@@ -302,11 +318,9 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
302318 case logical.SortPartitions (sortExprs, child) =>
303319 // This sort only sorts tuples within a partition. Its requiredDistribution will be
304320 // an UnspecifiedDistribution.
305- execution.Sort (sortExprs, global = false , planLater(child)) :: Nil
306- case logical.Sort (sortExprs, global, child) if sqlContext.conf.externalSortEnabled =>
307- execution.ExternalSort (sortExprs, global, planLater(child)):: Nil
321+ getSortOperator(sortExprs, global = false , planLater(child)) :: Nil
308322 case logical.Sort (sortExprs, global, child) =>
309- execution. Sort (sortExprs, global, planLater(child)):: Nil
323+ getSortOperator (sortExprs, global, planLater(child)):: Nil
310324 case logical.Project (projectList, child) =>
311325 execution.Project (projectList, planLater(child)) :: Nil
312326 case logical.Filter (condition, child) =>
0 commit comments