本人因为最近业务经常会使用hive,先整理一下常见的出错问题。
1.我最近遇见过一个棘手的问题是,对方给我一个月的数据源用天分割数据,也就是有30个文件夹。但我load到我hive中指定的表的时候发现有三天的数据拉不进去。随后我想把这三天的数据直接复制到我hive表的文件夹下不就可以了么。但随后hive查询并没有显示这三天的数据,但是业务着急先忽略这三天的数据。我去仔细看了一眼数据存储的文件,发现有多个子目录(几百个)。会导致hive拉取不进去。 后我将load 在指定为子目录层级后加载进去了。随后我对该表又进行操作,发现有如下的报错 return code 2 unexpected end of input stream。
后查看日志发现数据源有几个gz格式损坏。怀疑是复制到hive目录层级下,hive又加载进去一遍 。hive加载数据的时候有同名的数据,会导致加载的时候重命名,也或许是产生的中间文件没有删除(暂时没找到确切原因)。后通过日志找到该gz文件(数据)。有两种解决方法 一种就是重新加载数据源( 数据量太大 文件几千个 ),第二种就是将该gz文件下载下来 重新打包上传。
2.也是刚接触大数据 发现领导给的以前的一个逻辑 多表查询 有!=这个符号 ,后来发现hive有的版本不接受!=应该用<>,第二中就是尽量不要再hive中使用<>,因为会将一个表的所有数据加载到内存中判断,会导致mapreduce 卡死。可以用 left join代替
select * from a,b where a.taz!=b.taz;
可以替代为 select a.* from a left join b on a.taz=b.taz where b.id is null;
其实就是关联了之后b表的值不为null 就是等于 等于null 就是 !=