本博客用于记录在工作中遇到的错误,以作备忘,如有错误,欢迎指正。谢谢!
1.SemanticException [Error 10146]: Cannot truncate non-managed table test_null.
truncate table test_null;//test_null是一个外部表
truncate 不能删除外部表数据。原因:内部表数据由hive自身管理,但是外部表的数据并不由外部表管理,删除表时,内部表会连同数据一起删除,外部表只会删除元数据,而不会hdfs下的删除数据文件。
解决办法:如果该表存在分区,1.使用alter 删除分区,alter table table_name drop partition(p_data='20181219');2.删除hdfs上的数据。
2.mysql 中的substr函数使用
substr 的start 从1开始,如果写的是0,那么这个执行这个函数的结果是空 使用这个函数进行比较时,写成substr(utime,1,8) >'20170331'
3.mysql 导入hive出现:
原因:
1.mysql 导入hive中时sqoop中指定的--fields-terminated-by 分隔符与hive建表时的分隔符不一致导致查询出来的整行数据都被插入到第一列。采用字段分隔符时--fields-terminated-by \t 写成了--fields-terminated-by ‘\t’ 导致分隔符与建表时的\t 对不上。
2.MySQL中的某个字段与hive中的对应字段类型不匹配或者无法转化,会导致该列为null。
如果是由于MySQL中的某个字段与hive中的对应字段类型不匹配或者无法转化,会导致该列为null,那么在进行对外部表进行字段类型修改时,修改后表元数据更改,再次查询,出现该字段依然为空。
对于Hive 的分区外部表的已有分区,在对表新增或者修改字段后,相关分区不生效。原因是:表元数据虽然修改成功,但是分区也会对应列的元数据,这个地方不会随表的元数据修改而修改。
处理办法:
有两种
第一种:修改表,然后对于需要生效的分区,先drop 再 add. (或者说:先drop 表在重新建表再添加分区)
第二种:修改表,对需要生效的分区也执行添加或者修改字段的操作,比如:alter table tablename partition(year='2017') add columns(name STRING );