hive分享一些小问题

上一篇 / 下一篇  2011-10-09 10:13:11 / 个人分类:hadoop/hive

前几天听了凝兰MM的hive分享,关于row_number的问题已经专门发过邮件这儿不再赘述,再写几点体会:
1.sort by是用来排序的,group by一般是用来求和的。至于distribute by,是指hive执行reduce的过程中将reduce的mode设置为1,具体怎么设置的我也不知道,换句话说就是让reduce的过程在一台机器里进行才能排序,例如distribute by shop_id,user_id;即执行reduce的过程中,将shop_id,user_id相同记录放在同一台机器里然后用sort by进行排序,sort by只能完成按字段排序和少量数据的全排序。
如以下排序结果,字段分别是user_id,shop_id,auction_id,search_time,row_number(user_id,shop_id,auction_id) as result1,row_number(user_id,shop_id)as result2,ds
distribute by user_id,shop_id
sort by user_id,shop_id,auction_id asc,search_time asc
2006    10001   11      101     1       1       20041104
2006    10001   11      102     2       2       20041104
2006    10002   12      100     1       1       20041104
2006    10003   11      103     1       1       20041104
2006    10003   11      103     2       2       20041104
2006    10003   11      104     3       3       20041104
2006    10003   11      105     4       4       20041104
2006    10003   13      100     1       5       20041104
2006    10003   13      105     2       6       20041104
2006    10003   14      106     1       7       20041104
当有多个row_number的时候,sort by的字段必须取字段的并集,distribute by必须取交集,当数据量小的时候甚至可以用distribute by (1),但是当数据量太大这样是无法执行的,因为单个机器能处理的数据量有限。
2.先选取再join可以优化数据执行速度。很明显,按照where条件选取后数据量渐少,这个时候再join当然可以加快mapreduce执行速度,我应该去看看hive里层的东西。
3.关于hive里字段为空的问题,首先说明,NULL是NULL,空是空,字段设置成null了不一定就是空,hive里强制置空的符号是'\N',空是没有显示的,但字符长度length(\N)并不等于0。如果没有任何输入,比如直接两个ctrl+v+A,这时候length会等于0.
开发代码里经常有这样一条语句ALTER TABLE tmp_libingxue_getcity_output set serdeproperties('serialization.null.format' = '');这句话的意思是让null和''等价,也就是让null不显示,因为null对开发来说不好操作,可能不同地方代表意义不同,而且转码可能也会有问题,所有用''代替。
另外,关于字符转码,int转char或者char转int如果失败就会出现0或者null的情况(待继续验证)。对于字符串比较大小,如果字符串全是数字,则按数字大小比较,如果有字母,比较大小就没意义了。
4.分区什么时候创建,比如insert overwrite into table tmp_libingxue_a partition (pt='20041106') select * from tmp_libingxue_b;假如20041106这个分区存在是可以执行的,假如不存在则会执行失败,这时候就会涉及到一个问题分区什么时候创建?当我们需要分区的时候,可以在sql里使用alter table tmp_libingxue_a add partition (pt='20041106')添加该分区,更多的时候我们的mmt框架在执行common.php的过程中将$curdate当做参数传给了需要执行的脚本,而在case.php中都设置好了pt=$curdate或者pt='${curdate}000000',所有不用我们自己添加,框架执行的过程就已经创建好分区了。
然后就有一个动态分区的问题,如insert overwrite table tmp_libingxue_a partition(ds='$date',vertical_type)……,这时候并不是每次vertical_type有新的值就创建新的分区,而是执行之前就创建了vertical_type这个分区,每当vertical_type赋值的时候,相应的分区名字更改就可以了。使用动态分区要先设置hive.exec.dynamic.partition参数值为true,默认值为false,即不允许使用。
5.where和on的差别,什么时候用where什么时候用on?有三点:
on只作关联,不作过滤;
where条件只作主表的过滤条件;
任何非主表的过滤条件都必须在子查询中进行。
不举例子了,举例需要截图,editplus貌似只能做文本编辑。雨玟姐姐邮件里描述得很清楚。
6.关于这次分享一些其它感触。他们对hive理解好深刻的,花香一下子就看出了sql的问题,推翻了雨玟以前的论证,然后大家就开始推测会出现多少数据,四条,六条,八条,糊了!!凝兰MM还是很淡定的,换我的话肯定就慌了,这次分享对大家各自有收获,正如雨玟所说,受益最大的当然还是作分享的人。

TAG: hive join 分区

 

评分:0

我来说两句

日历

« 2024-04-18  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 36430
  • 日志数: 15
  • 建立时间: 2011-09-30
  • 更新时间: 2012-03-27

RSS订阅

Open Toolbar