hive常见问题指南
函数使用
1.lateral view explode的使用
在处理hive表的时候,遇到行转多列的需要,就需要lateral view explode。
使用:这条语句仅限跟在表名之后,如果有where条件那就只能再搞个子查询了。
explode()函数的参数必须为array类型。很多情况下,如果字段是字符型,也可以采用split函数的结果作为explode的输入。
在某个字段上使用这个函数的时候,需要注意该字段是否存在null值。如果该字段为null值,这个explode操作之后整条记录会丢失。如果需要保证不丢失,那么lateral view outer explode就是最好的选择了,相应的字段会用null值填充。
2.join操作
对于 a left join b的情况,需要注意表b中参与join的字段是否存在重复。left join的结果记录条数应当和左表的条数一样多,但是当右表关联的字段存在重复的时候,会使得结果表记录条数变多,因为重复的字段会多次join。
还要注意的一点是join的字段不要存在null值。这点很重要。如果在job的监控上发现reduce阶段有一个特别慢,除了数据倾斜等原因外,需要查看数据是否存在null值。
hive设置
1.压缩
中间压缩
set hive.exec.compress.intermediate=true; --对中间数据进行压缩可以减少job中map和reduce任务间的数据传输量
set mapred.map.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --也可自行选择GZ压缩
最终输出结果压缩
set hive.exec.compress.output=true;
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; --这里选择了GZ压缩
2.跨集群
a、要建有partition的表
b、建表时location指定当前集群和数据路径(如果不希望自动加分区,则可以选择不写)
c、加分区时location指定数据所在真实位置(host不能省)
d、要删除表或分区要使其location指向本集群
网友评论