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 {
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 ]
Original file line number Diff line number Diff 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
126155class OrcSourceSuite extends OrcSuite {
You can’t perform that action at this time.
0 commit comments