aboutsummaryrefslogtreecommitdiff
path: root/core
diff options
context:
space:
mode:
authorReynold Xin <rxin@databricks.com>2015-07-30 01:04:24 -0700
committerReynold Xin <rxin@databricks.com>2015-07-30 01:04:24 -0700
commit4a8bb9d00d8181aff5f5183194d9aa2a65deacdf (patch)
tree8ba07a935861132fe5e83aa10c73283308ba716e /core
parent76f2e393a5fad0db8b56c4b8dad5ef686bf140a4 (diff)
downloadspark-4a8bb9d00d8181aff5f5183194d9aa2a65deacdf.tar.gz
spark-4a8bb9d00d8181aff5f5183194d9aa2a65deacdf.tar.bz2
spark-4a8bb9d00d8181aff5f5183194d9aa2a65deacdf.zip
Revert "[SPARK-9458] Avoid object allocation in prefix generation."
This reverts commit 9514d874f0cf61f1eb4ec4f5f66e053119f769c9.
Diffstat (limited to 'core')
-rw-r--r--core/src/main/java/org/apache/spark/util/collection/unsafe/sort/PrefixComparators.java16
-rw-r--r--core/src/test/scala/org/apache/spark/util/collection/unsafe/sort/PrefixComparatorsSuite.scala12
2 files changed, 28 insertions, 0 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 a9ee6042fe..600aff7d15 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
@@ -29,6 +29,7 @@ public class 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 DoublePrefixComparator DOUBLE = new DoublePrefixComparator();
public static final class StringPrefixComparator extends PrefixComparator {
@@ -54,6 +55,21 @@ public class PrefixComparators {
public final long NULL_PREFIX = Long.MIN_VALUE;
}
+ public static final class FloatPrefixComparator 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);
+ }
+
+ public long computePrefix(float value) {
+ return Float.floatToIntBits(value) & 0xffffffffL;
+ }
+
+ public final long NULL_PREFIX = computePrefix(Float.NEGATIVE_INFINITY);
+ }
+
public static final class DoublePrefixComparator extends PrefixComparator {
@Override
public int compare(long aPrefix, long bPrefix) {
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 26b7a9e816..cf53a8ad21 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
@@ -55,6 +55,18 @@ 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)