避免hiveContext.jsonRDD方法去掉全为null的列

Sat Dec 19 20:00:28 CST 2015 751 大数据

文章摘要jsonRDD转DataFrame的方法,hiveContext.jsonRDD(jsonRDD: RDD[String])会删除value为null的key

使用scala编写spark程序时,往往会使用到hiveContex或sqlContext的jsonRDD方法,来将一个存储了json字符串的RDD[Stirng]转换为DataFrame,但是这个方法会将为value为null的key删除掉。


如hive中有表table:

a    b    c    d

1    2    3    null

4    5    6    null


那么这段代码执行过后,newTable:DataFrame中的列就变成a,b,c三个了,d列因为全部为null被删除掉了。

val table = hiveContext.sql("select a,b,c,d from table")
val jsonStrRDD = table.toJSON.map(jsonStr => {
    //do somethings...
   jsonStr
})
val newTable = hiveContext.jsonRDD(jsonStrRDD)


在很多时候,我们并不知道是否每一列都不会存在全部为null值的情况,如果在上面这段代码后面,又有下面这段代码就悲剧了:

newTable .registerTempTable("temp")
hiveContext.sql("select a,b,c,d from temp")


解决办法:

为了避免hiveContext.jsonRDD去掉全为null的列,可以带上一个schema参数:

hiveContext.jsonRDD(jsonStrRDD,table.schema)

这样的话,即使有某一列全为null值,也不会被删除了。


打赏
打赏

分享到: