菜鸡一只,记录一个hive报错~
前几天,我司的一位数据分析师来找我,给我看了一个报错,大概如下:
Caused by: java.lang.RuntimeException: Error creating a batch
at org.apache.hadoop.hive.ql.io.orc.VectorizedOrcInputFormat$VectorizedOrcRecordReader.createValue(VectorizedOrcInputFormat.java:114)
at org.apache.hadoop.hive.ql.io.orc.VectorizedOrcInputFormat$VectorizedOrcRecordReader.createValue(VectorizedOrcInputFormat.java:52)
at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.createValue(CombineHiveRecordReader.java:84)
at org.apache.hadoop.hive.ql.io.CombineHiveRecordReader.createValue(CombineHiveRecordReader.java:42)
at org.apache.hadoop.hive.shims.HadoopShimsSecure$CombineFileRecordReader.createValue(HadoopShimsSecure.java:156)
at org.apache.hadoop.mapred.MapTask$TrackedRecordReader.createValue(MapTask.java:180)
at org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:50)
at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:450)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:343)
at org.apache.hadoop.mapred.LocalJobRunner$Job$MapTaskRunnable.run(LocalJobRunner.java:243)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: org.apache.hadoop.hive.ql.metadata.HiveException: No type found for column type entry 19
其实就是他在count一张表的时候,报了这个异常。
因为我们公司之前hive的表,其实出现过一些数据和表结构不对应的关系,所以我自然而然就往那个方向上想了,不过想归想,我还是乖乖的百度寻找解决方法!~
结果搜索到了相关的博客,甚至issue!!
issue:https://issues.apache.org/jira/browse/HIVE-10598
相关博客:
https://blog.csdn.net/Team77/article/details/51822380?locationNum=3&fps=1
https://blog.csdn.net/u010010664/article/details/73379509
这样的报错出现在:
创建一张orc表,并且向该表插入数据,这时候再新增字段,插入新的数据,然后count这张表的时候就会报该异常!
总结:如何解决?
(有兴趣的大家可以自己研究下原因)
如果该表不是你维护的,你只是使用,建议使用方案一,如果该表是你维护的,建议方案二
方案一:在执行sql前执行set hive.vectorized.execution.enabled = false;
方案二:其实hive中最好还是不要有新增字段或者修改表结构等操作,还是老老实实新建一张表,把以前的数据插入进去即可