aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorReynold Xin <rxin@databricks.com>2015-07-30 17:17:27 -0700
committerReynold Xin <rxin@databricks.com>2015-07-30 17:17:27 -0700
commite7a0976e991f75a7bda99509e2b040daab965ae6 (patch)
tree8a8197424593977086fca74b073a96bd52f5a89d /core
parentdf32669514afc0223ecdeca30fbfbe0b40baef3a (diff)
downloadspark-e7a0976e991f75a7bda99509e2b040daab965ae6.tar.gz
spark-e7a0976e991f75a7bda99509e2b040daab965ae6.tar.bz2
spark-e7a0976e991f75a7bda99509e2b040daab965ae6.zip
[SPARK-9458][SPARK-9469][SQL] Code generate prefix computation in sorting & moves unsafe conversion out of TungstenSort.
Author: Reynold Xin <rxin@databricks.com> Closes #7803 from rxin/SPARK-9458 and squashes the following commits: 5b032dc [Reynold Xin] Fix string. b670dbb [Reynold Xin] [SPARK-9458][SPARK-9469][SQL] Code generate prefix computation in sorting & moves unsafe conversion out of TungstenSort.
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java49
-rw-r--r--core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala22
2 files changed, 33 insertions, 38 deletions
diff --git a/core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java b/core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java
index 600aff7d15..4d7e5b3dfb 100644
--- a/core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java
+++ b/core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java
@@ -28,9 +28,11 @@ public class PrefixComparators {
private PrefixComparators() {}
public static final StringPrefixComparator STRING = new StringPrefixComparator();
- public static final IntegralPrefixComparator INTEGRAL = new IntegralPrefixComparator();
- public static final FloatPrefixComparator FLOAT = new FloatPrefixComparator();
+ public static final StringPrefixComparatorDesc STRING_DESC = new StringPrefixComparatorDesc();
+ public static final LongPrefixComparator LONG = new LongPrefixComparator();
+ public static final LongPrefixComparatorDesc LONG_DESC = new LongPrefixComparatorDesc();
public static final DoublePrefixComparator DOUBLE = new DoublePrefixComparator();
+ public static final DoublePrefixComparatorDesc DOUBLE_DESC = new DoublePrefixComparatorDesc();
public static final class StringPrefixComparator extends PrefixComparator {
@Override
@@ -38,50 +40,55 @@ public class PrefixComparators {
return UnsignedLongs.compare(aPrefix, bPrefix);
}
- public long computePrefix(UTF8String value) {
+ public static long computePrefix(UTF8String value) {
return value == null ? 0L : value.getPrefix();
}
}
- /**
- * Prefix comparator for all integral types (boolean, byte, short, int, long).
- */
- public static final class IntegralPrefixComparator extends PrefixComparator {
+ public static final class StringPrefixComparatorDesc extends PrefixComparator {
+ @Override
+ public int compare(long bPrefix, long aPrefix) {
+ return UnsignedLongs.compare(aPrefix, bPrefix);
+ }
+ }
+
+ public static final class LongPrefixComparator extends PrefixComparator {
@Override
public int compare(long a, long b) {
return (a < b) ? -1 : (a > b) ? 1 : 0;
}
+ }
- public final long NULL_PREFIX = Long.MIN_VALUE;
+ public static final class LongPrefixComparatorDesc extends PrefixComparator {
+ @Override
+ public int compare(long b, long a) {
+ return (a < b) ? -1 : (a > b) ? 1 : 0;
+ }
}
- public static final class FloatPrefixComparator extends PrefixComparator {
+ public static final class DoublePrefixComparator extends PrefixComparator {
@Override
public int compare(long aPrefix, long bPrefix) {
- float a = Float.intBitsToFloat((int) aPrefix);
- float b = Float.intBitsToFloat((int) bPrefix);
- return Utils.nanSafeCompareFloats(a, b);
+ double a = Double.longBitsToDouble(aPrefix);
+ double b = Double.longBitsToDouble(bPrefix);
+ return Utils.nanSafeCompareDoubles(a, b);
}
- public long computePrefix(float value) {
- return Float.floatToIntBits(value) & 0xffffffffL;
+ public static long computePrefix(double value) {
+ return Double.doubleToLongBits(value);
}
-
- public final long NULL_PREFIX = computePrefix(Float.NEGATIVE_INFINITY);
}
- public static final class DoublePrefixComparator extends PrefixComparator {
+ public static final class DoublePrefixComparatorDesc extends PrefixComparator {
@Override
- public int compare(long aPrefix, long bPrefix) {
+ public int compare(long bPrefix, long aPrefix) {
double a = Double.longBitsToDouble(aPrefix);
double b = Double.longBitsToDouble(bPrefix);
return Utils.nanSafeCompareDoubles(a, b);
}
- public long computePrefix(double value) {
+ public static long computePrefix(double value) {
return Double.doubleToLongBits(value);
}
-
- public final long NULL_PREFIX = computePrefix(Double.NEGATIVE_INFINITY);
}
}
diff --git a/core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala b/core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala
index cf53a8ad21..26a2e96eda 100644
--- a/core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala
+++ b/core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala
@@ -29,8 +29,8 @@ class PrefixComparatorsSuite extends SparkFunSuite with PropertyChecks {
def testPrefixComparison(s1: String, s2: String): Unit = {
val utf8string1 = UTF8String.fromString(s1)
val utf8string2 = UTF8String.fromString(s2)
- val s1Prefix = PrefixComparators.STRING.computePrefix(utf8string1)
- val s2Prefix = PrefixComparators.STRING.computePrefix(utf8string2)
+ val s1Prefix = PrefixComparators.StringPrefixComparator.computePrefix(utf8string1)
+ val s2Prefix = PrefixComparators.StringPrefixComparator.computePrefix(utf8string2)
val prefixComparisonResult = PrefixComparators.STRING.compare(s1Prefix, s2Prefix)
val cmp = UnsignedBytes.lexicographicalComparator().compare(
@@ -55,27 +55,15 @@ class PrefixComparatorsSuite extends SparkFunSuite with PropertyChecks {
forAll { (s1: String, s2: String) => testPrefixComparison(s1, s2) }
}
- test("float prefix comparator handles NaN properly") {
- val nan1: Float = java.lang.Float.intBitsToFloat(0x7f800001)
- val nan2: Float = java.lang.Float.intBitsToFloat(0x7fffffff)
- assert(nan1.isNaN)
- assert(nan2.isNaN)
- val nan1Prefix = PrefixComparators.FLOAT.computePrefix(nan1)
- val nan2Prefix = PrefixComparators.FLOAT.computePrefix(nan2)
- assert(nan1Prefix === nan2Prefix)
- val floatMaxPrefix = PrefixComparators.FLOAT.computePrefix(Float.MaxValue)
- assert(PrefixComparators.FLOAT.compare(nan1Prefix, floatMaxPrefix) === 1)
- }
-
test("double prefix comparator handles NaNs properly") {
val nan1: Double = java.lang.Double.longBitsToDouble(0x7ff0000000000001L)
val nan2: Double = java.lang.Double.longBitsToDouble(0x7fffffffffffffffL)
assert(nan1.isNaN)
assert(nan2.isNaN)
- val nan1Prefix = PrefixComparators.DOUBLE.computePrefix(nan1)
- val nan2Prefix = PrefixComparators.DOUBLE.computePrefix(nan2)
+ val nan1Prefix = PrefixComparators.DoublePrefixComparator.computePrefix(nan1)
+ val nan2Prefix = PrefixComparators.DoublePrefixComparator.computePrefix(nan2)
assert(nan1Prefix === nan2Prefix)
- val doubleMaxPrefix = PrefixComparators.DOUBLE.computePrefix(Double.MaxValue)
+ val doubleMaxPrefix = PrefixComparators.DoublePrefixComparator.computePrefix(Double.MaxValue)
assert(PrefixComparators.DOUBLE.compare(nan1Prefix, doubleMaxPrefix) === 1)
}