【发布时间】:2018-06-21 14:47:16
【问题描述】:
如何处理时间戳列中的空值?
我在 List 中保存了源数据(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 不同。
我该如何处理?是否可以在一列中混合数据类型,还是必须将所有空值映射到“空时间戳”?
【问题讨论】:
-
您能否描述一下 input 列表值 (
[222,1,222,222,2012-01-28 23:37:06.0,()]) 的结构?每一行对应的每个条目的数据类型是什么?里面的细胞是什么类型的? -
您是如何生成该列表的?这就是问题所在。您在该列中有
Unit值,而不是nulls。 (列中是否有任何时间戳或全部为Unit?
标签: scala apache-spark