11.3.4 Hive QL使用实例

下面我们通过两个例子对Hive QL的使用方法进行介绍,从中可以看到它与传统SQL语句的异同点。

1.电影评分

首先创建表,并且使用tab空格定义文本格式:


CREATE TABLE u_data(

userid INT,

movieid INT,

rating INT,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY'\t'

STORED AS TEXTFILE;


然后下载数据文本文件并解压,代码如下:


wget http://www.grouplens.org/system/files/ml-data.tar__0.gz

tar xvzf ml-data.tar__0.gz


将文件加载到表中,代码如下:


LOAD DATA LOCAL INPATH'ml-data/u.data'

OVERWRITE INTO TABLE u_data;

Count the number of rows in table u_data:

SELECT COUNT(*)FROM u_data;//由于版本问题,如果此处出现错误,你可能需要使用COUNT(1)替换

COUNT(*)


下面可以基于该表进行一些复杂的数据分析操作,此处我们使用Python语言,首先创建Python脚本,如代码清单11-4所示。

代码清单11-4 weekday_mapper.py脚本文件


import sys

import datetime

for line in sys.stdin:

line=line.strip()

userid, movieid, rating, unixtime=line.split('\t')

weekday=datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()

print'\t'.join([userid, movieid, rating, str(weekday)])


使用如下mapper脚本调用weekday_mapper.py脚本进行操作。


CREATE TABLE u_data_new(

userid INT,

movieid INT,

rating INT,

weekday INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY'\t';

add FILE weekday_mapper.py;

INSERT OVERWRITE TABLE u_data_new

SELECT

TRANSFORM(userid, movieid, rating, unixtime)

USING'python weekday_mapper.py'

AS(userid, movieid, rating, weekday)

FROM u_data;

SELECT weekday, COUNT(*)

FROM u_data_new

GROUP BY weekday;


2.Apache网络日志数据(Weblog)

可以定制Apache网络日志数据格式,不过一般管理者都使用默认的格式。对于默认设置的Apache Weblog可以使用以下命令创建表:


add jar../build/contrib/hive_contrib.jar;

CREATE TABLE apachelog(

host STRING,

identity STRING,

user STRING,

time STRING,

request STRING,

status STRING,

size STRING,

referer STRING,

agent STRING)

ROW FORMAT SERDE'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'

WITH SERDEPROPERTIES(

"input.regex"="([^])([^])([^])(-|\[[^\]]\])([^\"]|\"[^\"]\")

(-|[0-9])(-|[0-9])(?:([^\"]|\"[^\"]\")([^\"]|\"[^\"]\"))?",

"output.format.string"="%1$s%2$s%3$s%4$s%5$s%6$s%7$s%8$s%9$s"

STORED AS TEXTFILE;


更多内容可以查看http://issues.apache.org/jira/browse/HIVE-662。