File tree Expand file tree Collapse file tree 2 files changed +53
-5
lines changed
main/scala/org/apache/spark/sql/hive
test/scala/org/apache/spark/sql/hive/orc Expand file tree Collapse file tree 2 files changed +53
-5
lines changed Original file line number Diff line number Diff line change @@ -370,17 +370,36 @@ private[hive] trait HiveInspectors {
370
370
protected def wrapperFor (oi : ObjectInspector , dataType : DataType ): Any => Any = oi match {
371
371
case _ : JavaHiveVarcharObjectInspector =>
372
372
(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
+ }
375
379
376
380
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
+ }
378
387
379
388
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
+ }
381
395
382
396
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
+ }
384
403
385
404
case soi : StandardStructObjectInspector =>
386
405
val schema = dataType.asInstanceOf [StructType ]
Original file line number Diff line number Diff line change @@ -121,6 +121,35 @@ abstract class OrcSuite extends QueryTest with BeforeAndAfterAll {
121
121
sql(" SELECT * FROM normal_orc_as_source" ),
122
122
(6 to 10 ).map(i => Row (i, s " part- $i" )))
123
123
}
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
+ }
124
153
}
125
154
126
155
class OrcSourceSuite extends OrcSuite {
You can’t perform that action at this time.
0 commit comments