2009-09-22 @ taobao
引言
本文的主要目的是让读者可以使用hiveQL对已有的海量数据进行简单的查询操作. 它适合于Hive的新手快速入门, 但前提是本文假定读者基本熟悉SQL.
特别注意的是, 本文力求精简实用, 因此这里强烈建议读者在阅读的过程中同时参看下列链接:
Hive Shell
进入shell
若Hive安装与部署成功之后, 你在命令行下键入hive进入shell, 如
![]() |
提示符 下面的$是linux shell 提示符, hive>是hive shell 提示符. |
$ hive
Hive history file=/tmp/jushi/hive_job_log_jushi_200909221044_69735608.txt
hive>
退出shell
hive> quit;
$
查看已有表
hive> show tables;
OK
mock_records_seq
p1
Time taken: 2.679 seconds
查看表结构
hive> describe mock_records_seq;
OK
property string
id string
auction_status int zoo string
Time taken: 0.065 seconds
执行查询
HiveQL支持*大部分*标准SQL的Select语法, 因此可以像写SQL一样在hive shell中执行数据查询操作. 关于HiveQL与SQL的区别可以参看:
hive> select * from mock_records_seq;
Total MapReduce jobs = 1Number of reduce tasks is set to 0 since there's no reduce operator Starting Job = job_200909212156_1141, Tracking URL = http://hdpjt.cm3:50030/jobdetails.jsp?jobid=job_200909212156_1141Kill Command = /home/hadoop/hadoop-current/bin/../bin/hadoop job -Dmapred.job.tracker=hdpjt.cm3:9001 -kill job_200909212156_1141
2009-09-22 11:02:03,532 map = 0%, reduce =0%
2009-09-22 11:02:11,564 map = 100%, reduce =0%
Ended Job = job_200909212156_1141
OK
5303:19399;10812:2637 eccbc87e4b5ce2fe28308fd9f2a7baf3 0 7891:2334
13295:15699;2509:17602 a87ff679a2f3e71d9181a67b7542122c 0 16258:19904
16668:12012;10544:12071 c4ca4238a0b923820dcc509a6f75849b 0 5669:8857
14682:9011;7716:11310 c81e728d9d4c2f636f067f89cc14862c 0 2810:17378
Time taken: 67.693 seconds
数据类型
目前在hive中常用的数据类型有:
- BIGINT – 主要用于状态,类别,数量的字段, 如status/option/type/quantity
- DOUBLE – 主要用于金额的字段, 如fee/price/bid
- STRING – 除上述之外的字段基本都使用String, 尤其是id和日期时间这样的字段
更多hive数据类型请见http://wiki.apache.org/hadoop/Hive/Tutorial#Type_System
内建操作符和函数
操作符
标准SQL中几乎所有的操作符在HiveQL中都被支持. 具体参见http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF#Built_in_Operators
RLIKE
在日志相关的数据查询中, RLIKE 被使用的机会会很多, 例如
查09年8月23日全网店铺访问PV:
hive> select count(1) from web_log where logdate = '20090823' && url rlike 'http://shop\\d+\\.taobao\\.com/.+'
![]() |
正则表达式 RLIKE后跟的是Java regular expression.值得注意的是, 在使用\d, \w, \s之类的表达式时,需要多加上一个\, 以避免单个\被视为转义符. 就好像上例中为了匹配一串数字,则使用:
|
函数
类型函数
- cast 将表达式的结果转化成一个特定的类型, 例如
cast('1' as BIGINT) // 将字符串1转为BIGINT.
条件函数
- if 根据第一个参数表达式的布尔值结果, 为真返回第二个参数表达式的结果, 反之返回第三个参数表达式的结果.
if(true, 't', 'f') // = 't'if(false, 't', 'f') // = 'f'
- coalesce 返回参数列表中第一个结果不会null的值, 若都会null则返回null.
coalesce(1,2,3) // = 1coalesce(null,2,3) // = 2
日期函数
- to_date
to_date('1970-01-01 00:00:00') // = '1970-01-01'
- date_add
date_add('2008-12-31', 1) // = '2009-01-01'
- date_sub
date_sub('2008-12-31', 1) // = '2008-12-30'
聚合函数
- count
select count(1) from web_log where logdate= '20090823'; // 20090823全网PV
- sum
select sum(fee) from tc_biz_order where gmt_create = '20090823'; // 20090823订单总额
- avg
select avg(auction_price) from tc_biz_order where gmt_create = '20090823' and aucton_id = '123456'; // 20090823宝贝123456的成交均价
更多函数介绍请见http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF#Built-in_Functions