@@ -27,6 +27,7 @@ import org.apache.spark.sql.catalyst.expressions._
2727import org .apache .spark .sql .Row
2828import org .apache .spark .sql .catalyst .plans .physical ._
2929import org .apache .spark .util .collection .ExternalSorter
30+ import org .apache .spark .util .collection .unsafe .sort .PrefixComparator
3031import org .apache .spark .util .{CompletionIterator , MutablePair }
3132import org .apache .spark .{HashPartitioner , SparkEnv }
3233
@@ -274,7 +275,18 @@ case class UnsafeExternalSort(
274275 def doSort (iterator : Iterator [InternalRow ]): Iterator [InternalRow ] = {
275276 val ordering = newOrdering(sortOrder, child.output)
276277 val boundSortExpression = BindReferences .bindReference(sortOrder.head, child.output)
277- val prefixComparator = SortPrefixUtils .getPrefixComparator(boundSortExpression)
278+ // Hack until we generate separate comparator implementations for ascending vs. descending
279+ // (or choose to codegen them):
280+ val prefixComparator = {
281+ val comp = SortPrefixUtils .getPrefixComparator(boundSortExpression)
282+ if (sortOrder.head.direction == Descending ) {
283+ new PrefixComparator {
284+ override def compare (p1 : Long , p2 : Long ): Int = - 1 * comp.compare(p1, p2)
285+ }
286+ } else {
287+ comp
288+ }
289+ }
278290 val prefixComputer = {
279291 val prefixComputer = SortPrefixUtils .getPrefixComputer(boundSortExpression)
280292 new UnsafeExternalRowSorter .PrefixComputer {
0 commit comments