一、问题及分析
我将一个tinyint的字段通过hive客户端修改为smallint类型,并使用spark插入数据。后续通过presto查询数据时候,报错:
java.io.IOException: Malformed ORC file. Can not read SQL type tinyint from ORC stream .origin of type SHORT
说是不能读取tinyint的类型,显然,它没有认出我最新的数据类型,那么基本上认为它拿到的是旧的元数据。思路:
1.重新建表,重新入数。
2.让它拿到正确的元数据。
第一个代价太大,并且不是最优的合理思路(经过验证,即便是重新入,也重建分区就行,不用删表建表)。
二、查找方案
经过一些列的百度,最终还是去了官网,发现这么一段文字:
经过尝试,发现了
"MSCK [REPAIR] TABLE table_name"
这个命令。
但是!:我在找到这个方法前,是先删除了分区,重入了该分区的数据解决的,我发现了有的分区能查出结果——修改字段类型之后插入的分区是没问题的,说明识别文件格式的单位可以精细到分区而不是整个数据表。
下次有机会验证一下msck吧,虽然这次没有用到,但是这个命令让我知道了,是可以人为同步元数据的,这很有用!!!