@@ -291,6 +291,22 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
291
291
object BasicOperators extends Strategy {
292
292
def numPartitions : Int = self.numPartitions
293
293
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
+
294
310
def apply (plan : LogicalPlan ): Seq [SparkPlan ] = plan match {
295
311
case r : RunnableCommand => ExecutedCommand (r) :: Nil
296
312
@@ -302,11 +318,9 @@ private[sql] abstract class SparkStrategies extends QueryPlanner[SparkPlan] {
302
318
case logical.SortPartitions (sortExprs, child) =>
303
319
// This sort only sorts tuples within a partition. Its requiredDistribution will be
304
320
// 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
308
322
case logical.Sort (sortExprs, global, child) =>
309
- execution. Sort (sortExprs, global, planLater(child)):: Nil
323
+ getSortOperator (sortExprs, global, planLater(child)):: Nil
310
324
case logical.Project (projectList, child) =>
311
325
execution.Project (projectList, planLater(child)) :: Nil
312
326
case logical.Filter (condition, child) =>
0 commit comments