[译]Hive学习指南(四)

查询和插入数据

Hive查询操作参见文档Select,插入操作参见文档Inserting data into Hive Tables from queriesWriting data into the filesystem from queries

简单查询

下面示例为查询所有活跃用户:

INSERT OVERWRITE TABLE user_active
SELECT user.*
FROM user
WHERE user.active = 1;

注意和SQL不一样,这里总是将数据插入到user_active表中。稍后会说明用户如何检查这些结果,并且将结果转存到本地文件中。可以在Beeline和[Hive CLI]中运行下面的查询:

SELECT user.*
FROM user
WHERE user.active = 1;

结果会重写为一些临时文件并在Hive客户端进行展示。

基于分区的查询

查询中使用哪些分区是由系统根据where语句中分区列的条件决定的。例如,为了获取所有03/2008从xyz.com引用过来的page_views,可以使用如下查询:

INSERT OVERWRITE TABLE xyz_com_page_views
SELECT page_views.*
FROM page_views
WHERE page_views.date >= '2008-03-01' AND page_views.date <= '2008-03-31' AND
      page_views.referrer_url like '%xyz.com';

注意这里用到了page_views.date,因为上面的表定义了PARTITIONED BY(date DATETIME, country STRING)

连接

为了获取2008-03-03的page_view人员统计分析(按照性别),可以使用userid列连接page_view表和user表。使用下面查询实现:

INSERT OVERWRITE TABLE pv_users
SELECT pv.*, u.gender, u.age
FROM user u JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';

要进行外连接,可使用LEFT OUTERRIGHT OUTERFULL OUTER(左保留,右保留或双向保留)关键字。例如,对上面的查询进行全外连接,如下:

INSERT OVERWRITE TABLE pv_users
SELECT pv.*, u.gender, u.age
FROM user u FULL OUTER JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';

检查key是否在另一个表存在,可使用LEFT SEMI JOIN,如下:

INSERT OVERWRITE TABLE pv_users
SELECT u.*
FROM user u LEFT SEMI JOIN page_view pv ON (pv.userid = u.id)
WHERE pv.date = '2008-03-03';

想连接多个表,如下:

INSERT OVERWRITE TABLE pv_friends
SELECT pv.*, u.gender, u.age, f.friends
FROM page_view pv JOIN user u ON (pv.userid = u.id) JOIN friend_list f ON (u.id = f.uid)
WHERE pv.date = '2008-03-03';

注意Hive只支持equi-joins。建议将最大的表放在连接的最右边,这样性能最好。

聚合

按照性别计算不同用户数量,如下:

INSERT OVERWRITE TABLE pv_gender_sum
SELECT pv_users.gender, count (DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;

可以同时进行多个聚合,但是不能对不同列进行聚合,下面代码是允许的:

INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(*), sum(DISTINCT pv_users.userid)
FROM pv_users
GROUP BY pv_users.gender;

下面查询是不允许的:

INSERT OVERWRITE TABLE pv_gender_agg
SELECT pv_users.gender, count(DISTINCT pv_users.userid), count(DISTINCT pv_users.ip)
FROM pv_users
GROUP BY pv_users.gender;

多表/文件插入

聚合或者简单查询的输出可以进一步发送到多个表或者hadoop dfs文件。如下:

FROM pv_users
INSERT OVERWRITE TABLE pv_gender_sum
    SELECT pv_users.gender, count_distinct(pv_users.userid)
    GROUP BY pv_users.gender
 
INSERT OVERWRITE DIRECTORY '/user/data/tmp/pv_age_sum'
    SELECT pv_users.age, count_distinct(pv_users.userid)
    GROUP BY pv_users.age;

第一个insert语句将结果插入到Hive表中,第二个将结果存储到hadoop dfs文件中。

插入到本地文件

将结果输出到本地文件,这样可以使用excel等工具查看文件。如下:

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/pv_gender_sum'
SELECT pv_gender_sum.*
FROM pv_gender_sum;

抽样

抽样语句让用户可以写查询抽样部分数据。目前抽样是在列上进行的,在CREATE TABLE中的CLUSTERED BY语句中指定。下面的示例选择了pv_gender_sum表的第3个桶:

INSERT OVERWRITE TABLE pv_gender_sum_sample
SELECT pv_gender_sum.*
FROM pv_gender_sum TABLESAMPLE(BUCKET 3 OUT OF 32);

通常TABLESAMPLE语法是这样的:

TABLESAMPLE(BUCKET x OUT OF y)

y是表创建时指定的桶数量。针对上面的示例,下面的语句会选择第3个和第19个桶。

TABLESAMPLE(BUCKET 3 OUT OF 16)

下面的语句会选择第3个桶的一半。

TABLESAMPLE(BUCKET 3 OUT OF 64 ON userid)

Union All

Hive SQL支持union all,例如,我们有两个表,一个跟踪用户发布视频,一个跟踪用户发布评论,下面的查询将union all的结果和user表进行连接:

INSERT OVERWRITE TABLE actions_users
SELECT u.id, actions.date
FROM (
    SELECT av.uid AS uid
    FROM action_video av
    WHERE av.date = '2008-06-03'
 
    UNION ALL
 
    SELECT ac.uid AS uid
    FROM action_comment ac
    WHERE ac.date = '2008-06-03'
    ) actions JOIN users u ON(u.id = actions.uid);

数组操作

表中可以添加数组列,如下:

CREATE TABLE array_table (int_array_column ARRAY<INT>);

假设pv.friendsARRAY<INT>类型的,用户可以使用索引来获取指定的元素,如下:

SELECT pv.friends[2]
FROM page_views pv;

select语句获取了pv.friends的第三个元素。

用户也可以获取数组的长度,使用size函数,如下:

SELECT pv.userid, size(pv.friends)
FROM page_view pv;

Map操作

Map操作和数组操作类似。这种结构目前只能编程创建。之后会进行扩展。假设pv.propertiesmap<String, String>类型,它是字符串到字符串的关联数组。

INSERT OVERWRITE page_views_map
SELECT pv.userid, pv.properties['page type']
FROM page_views pv;

上面示例从page_views表中查询page_type属性。

与数组类型,size函数可用于获取Map中元素的数量:

SELECT size(pv.properties)
FROM page_view pv;

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,126评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,254评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,445评论 0 341
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,185评论 1 278
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,178评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,970评论 1 284
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,276评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,927评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,400评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,883评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,997评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,646评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,213评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,204评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,423评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,423评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,722评论 2 345

推荐阅读更多精彩内容