1.问题描述
用insert overwrite方式往hive写入的数据,数据写入成功了,在hive查询是可以查到数据的,但在impala刷新元数据后,查询却没有查到,刚开始以为是元数据刷新不成功,再用命令
refresh table_name
刷新成功后还是没有数据,返回结果为空。
2.问题追溯
往hive表写入数据sql里使用了union all
3.解决方案
在写入数据sql 后面加上 distribute by + 表中字段 就可以了。
distribute by 具体用法怎么用
1.问题描述
用insert overwrite方式往hive写入的数据,数据写入成功了,在hive查询是可以查到数据的,但在impala刷新元数据后,查询却没有查到,刚开始以为是元数据刷新不成功,再用命令
refresh table_name
刷新成功后还是没有数据,返回结果为空。
2.问题追溯
往hive表写入数据sql里使用了union all
3.解决方案
在写入数据sql 后面加上 distribute by + 表中字段 就可以了。
distribute by 具体用法怎么用
我猜测你把distribute by写在union外层了。比如insert overwrite select (selct a union select b union select c) distribute by cola。这种写法是可以的。
原因应该是因为hive 对union本身的处理机制与impala的协议之间的缺陷导致。union 会在hive底层层出hdfs里多加一层目录存放每块数据,hive元数据中是清楚这个结构的,所以它自己能查到,而impala不知道还有hive这种骚操作,它读到第一层就不往下走了,没发现也没想到真正的数据在下一层,因此它查不到数据。在union外层加上distribute by,hive会把多个union的结果reduce后得到一个结果集,在此之上再根据distribute 去map数据到每个reduce,这样就不会在hdfs第一层之下再写一层数据,而是直接写在了数据层是第一层,impala这才发现了数据。
你可以做一个测试,看看hdfs层是否是这样处理。