目录
一、问题描述
dataFrame每个字段且每行都有值,调用API存储hive ORC格式,再查看数据库时部分列显示为NULL。
存储代码:
//构造df伪代码,假设只有name、age、address三个字段
retFrame.withColumn("NAME",col(""))
.withColumn("age",col(""))
.withColumn("ADDRESS",col(""))
//入库处理
logger.info(DateUtil.getNowDate() + "======结果入库")
retFrame.write.format("orc")
.mode("overwrite").saveAsTable("table")
logger.info(DateUtil.getNowDate() + "======入库结束")
存储完成之后,发现table表中的name和address字段列全为NULL,只有age列有值;
二、问题分析
这是因为hive在存储ORC文件时,ORC的schema是区分大小写的,一般查询hive中的字段显示都全为小写,所以hive存储的默认字段为小写,因此存储为大写的字段显示的NULL,可以在存储hive之前把每个字段都转化为小写或者加个小写别名;
//构造df伪代码,假设只有name、age、address三个字段
retFrame.withColumn("name",col(""))
.withColumn("age",col(""))
.withColumn("arrdess",col(""))
//入库处理
logger.info(DateUtil.getNowDate() + "======结果入库")
retFrame.write.format("orc")
.mode("overwrite").saveAsTable("table")
logger.info(DateUtil.getNowDate() + "======入库结束")
通过以上将大写改成小写之后,存储结果显示正常有值。
因此在查询ORC格式的hive表时也要使用小写字段进行查询避免出错;