aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorYin Huai <yhuai@databricks.com>2015-08-25 16:19:34 +0800
committerCheng Lian <lian@databricks.com>2015-08-25 16:19:34 +0800
commit0e6368ffaec1965d0c7f89420e04a974675c7f6e (patch)
tree7e07e729535043ff42d503aa54875b2d0fac3074 /sql
parent7bc9a8c6249300ded31ea931c463d0a8f798e193 (diff)
downloadspark-0e6368ffaec1965d0c7f89420e04a974675c7f6e.tar.gz
spark-0e6368ffaec1965d0c7f89420e04a974675c7f6e.tar.bz2
spark-0e6368ffaec1965d0c7f89420e04a974675c7f6e.zip
[SPARK-10197] [SQL] Add null check in wrapperFor (inside HiveInspectors).
https://issues.apache.org/jira/browse/SPARK-10197 Author: Yin Huai <yhuai@databricks.com> Closes #8407 from yhuai/ORCSPARK-10197.
Diffstat (limited to 'sql')
-rw-r--r--sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala29
-rw-r--r--sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala29
2 files changed, 53 insertions, 5 deletions
diff --git a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala
index 9824dad239..64fffdbf9b 100644
--- a/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala
+++ b/sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala
@@ -370,17 +370,36 @@ private[hive] trait HiveInspectors {
protected def wrapperFor(oi: ObjectInspector, dataType: DataType): Any => Any = oi match {
case _: JavaHiveVarcharObjectInspector =>
(o: Any) =>
- val s = o.asInstanceOf[UTF8String].toString
- new HiveVarchar(s, s.size)
+ if (o != null) {
+ val s = o.asInstanceOf[UTF8String].toString
+ new HiveVarchar(s, s.size)
+ } else {
+ null
+ }
case _: JavaHiveDecimalObjectInspector =>
- (o: Any) => HiveDecimal.create(o.asInstanceOf[Decimal].toJavaBigDecimal)
+ (o: Any) =>
+ if (o != null) {
+ HiveDecimal.create(o.asInstanceOf[Decimal].toJavaBigDecimal)
+ } else {
+ null
+ }
case _: JavaDateObjectInspector =>
- (o: Any) => DateTimeUtils.toJavaDate(o.asInstanceOf[Int])
+ (o: Any) =>
+ if (o != null) {
+ DateTimeUtils.toJavaDate(o.asInstanceOf[Int])
+ } else {
+ null
+ }
case _: JavaTimestampObjectInspector =>
- (o: Any) => DateTimeUtils.toJavaTimestamp(o.asInstanceOf[Long])
+ (o: Any) =>
+ if (o != null) {
+ DateTimeUtils.toJavaTimestamp(o.asInstanceOf[Long])
+ } else {
+ null
+ }
case soi: StandardStructObjectInspector =>
val schema = dataType.asInstanceOf[StructType]
diff --git a/sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala b/sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala
index 82e08caf46..80c38084f2 100644
--- a/sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala
+++ b/sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala
@@ -121,6 +121,35 @@ abstract class OrcSuite extends QueryTest with BeforeAndAfterAll {
sql("SELECT * FROM normal_orc_as_source"),
(6 to 10).map(i => Row(i, s"part-$i")))
}
+
+ test("write null values") {
+ sql("DROP TABLE IF EXISTS orcNullValues")
+
+ val df = sql(
+ """
+ |SELECT
+ | CAST(null as TINYINT),
+ | CAST(null as SMALLINT),
+ | CAST(null as INT),
+ | CAST(null as BIGINT),
+ | CAST(null as FLOAT),
+ | CAST(null as DOUBLE),
+ | CAST(null as DECIMAL(7,2)),
+ | CAST(null as TIMESTAMP),
+ | CAST(null as DATE),
+ | CAST(null as STRING),
+ | CAST(null as VARCHAR(10))
+ |FROM orc_temp_table limit 1
+ """.stripMargin)
+
+ df.write.format("orc").saveAsTable("orcNullValues")
+
+ checkAnswer(
+ sql("SELECT * FROM orcNullValues"),
+ Row.fromSeq(Seq.fill(11)(null)))
+
+ sql("DROP TABLE IF EXISTS orcNullValues")
+ }
}
class OrcSourceSuite extends OrcSuite {