Skip to content

Commit beeb01f

Browse files
committed
null check in wrapperFor.
1 parent d7b4c09 commit beeb01f

File tree

2 files changed

+53
-5
lines changed

2 files changed

+53
-5
lines changed

sql/hive/src/main/scala/org/apache/spark/sql/hive/HiveInspectors.scala

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,17 +370,36 @@ private[hive] trait HiveInspectors {
370370
protected def wrapperFor(oi: ObjectInspector, dataType: DataType): Any => Any = oi match {
371371
case _: JavaHiveVarcharObjectInspector =>
372372
(o: Any) =>
373-
val s = o.asInstanceOf[UTF8String].toString
374-
new HiveVarchar(s, s.size)
373+
if (o != null) {
374+
val s = o.asInstanceOf[UTF8String].toString
375+
new HiveVarchar(s, s.size)
376+
} else {
377+
null
378+
}
375379

376380
case _: JavaHiveDecimalObjectInspector =>
377-
(o: Any) => HiveDecimal.create(o.asInstanceOf[Decimal].toJavaBigDecimal)
381+
(o: Any) =>
382+
if (o != null) {
383+
HiveDecimal.create(o.asInstanceOf[Decimal].toJavaBigDecimal)
384+
} else {
385+
null
386+
}
378387

379388
case _: JavaDateObjectInspector =>
380-
(o: Any) => DateTimeUtils.toJavaDate(o.asInstanceOf[Int])
389+
(o: Any) =>
390+
if (o != null) {
391+
DateTimeUtils.toJavaDate(o.asInstanceOf[Int])
392+
} else {
393+
null
394+
}
381395

382396
case _: JavaTimestampObjectInspector =>
383-
(o: Any) => DateTimeUtils.toJavaTimestamp(o.asInstanceOf[Long])
397+
(o: Any) =>
398+
if (o != null) {
399+
DateTimeUtils.toJavaTimestamp(o.asInstanceOf[Long])
400+
} else {
401+
null
402+
}
384403

385404
case soi: StandardStructObjectInspector =>
386405
val schema = dataType.asInstanceOf[StructType]

sql/hive/src/test/scala/org/apache/spark/sql/hive/orc/OrcSourceSuite.scala

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,35 @@ abstract class OrcSuite extends QueryTest with BeforeAndAfterAll {
121121
sql("SELECT * FROM normal_orc_as_source"),
122122
(6 to 10).map(i => Row(i, s"part-$i")))
123123
}
124+
125+
test("write null values") {
126+
sql("DROP TABLE IF EXISTS orcNullValues")
127+
128+
val df = sql(
129+
"""
130+
|SELECT
131+
| CAST(null as TINYINT),
132+
| CAST(null as SMALLINT),
133+
| CAST(null as INT),
134+
| CAST(null as BIGINT),
135+
| CAST(null as FLOAT),
136+
| CAST(null as DOUBLE),
137+
| CAST(null as DECIMAL(7,2)),
138+
| CAST(null as TIMESTAMP),
139+
| CAST(null as DATE),
140+
| CAST(null as STRING),
141+
| CAST(null as VARCHAR(10))
142+
|FROM orc_temp_table limit 1
143+
""".stripMargin)
144+
145+
df.write.format("orc").saveAsTable("orcNullValues")
146+
147+
checkAnswer(
148+
sql("SELECT * FROM orcNullValues"),
149+
Row.fromSeq(Seq.fill(11)(null)))
150+
151+
sql("DROP TABLE IF EXISTS orcNullValues")
152+
}
124153
}
125154

126155
class OrcSourceSuite extends OrcSuite {

0 commit comments

Comments
 (0)