如何处理“时间戳”列中的空值?
我将源数据保存在列表中(sql的结果)
List([222,1,222,222,2012-01-28 23:37:06.0,()],
[220,1,220,220,2012-04-24 23:37:08.0,()],
[220,1,220,220,2008-03-18 15:06:09.0,()],
...
在最后一列中是带有时间戳的空值。
但是当我尝试将其加载为RDD时
//Create RDD
val rdd = spark.sparkContext.makeRDD(res.toList)
// Create schema fields
val fields = List (StructField("value", StringType, nullable = true)
,StructField("hit_count", IntegerType, nullable = true)
,StructField("range_start", StringType, nullable = true)
,StructField("range_end", StringType, nullable = true)
,StructField("valid_from", TimestampType, nullable = true)
,StructField("valid_to", TimestampType, nullable = true))
// Create DataFrame
val dataFrame = spark.createDataFrame(rdd, StructType(fields))
我要例外
由以下原因引起:java.lang.RuntimeException:scala.runtime.BoxedUnit不是 时间戳模式的有效外部类型
因此Null值被包装为BoxedUnit,其类型不同于TimestampType。
我该如何处理?在一列中可能有混合的数据类型,还是我必须将所有空值映射到“空时间戳”?
答案 0 :(得分:2)
您的scala.runtime.BoxedUnit
数据中有res
个数据类型([222,1,222,222,2012-01-28 23:37:06.0,()])
多数民众赞成在将时间戳模式应用于BoxedUnit
时遇到的异常的主要原因原因:java.lang.RuntimeException:scala.runtime.BoxedUnit不是时间戳模式的有效外部类型
因此,您可以做的是在rdd
中进行类型检查,如果找到了BoxedUnit
,则可以用有效的timestamp
代替。为了进行测试,我使用了valid_from
时间戳记
//Create RDD
val rdd = spark.sparkContext.makeRDD(res)
.map(row => Row(row(0), row(1), row(2), row(3), row(4), if(row(5).isInstanceOf[BoxedUnit]) row(4) else row(5)))
我所做的所有事情都添加了完成类型检查的地图
我希望答案会有所帮助