时间戳记StructField中的空值

时间:2018-06-21 14:47:17

标签: scala apache-spark

如何处理“时间戳”列中的空值?

我将源数据保存在列表中(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。

我该如何处理?在一列中可能有混合的数据类型,还是我必须将所有空值映射到“空时间戳”?

1 个答案:

答案 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)))

我所做的所有事情都添加了完成类型检查的地图

我希望答案会有所帮助