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;

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Hive SQL开发指南是指针对Hive SQL编程的一份指南或指导手册。Hive是一个基于Hadoop的开源数据仓库工具,它使用Hive Query Language(HiveQL)进行数据查询和分析。以下是关于Hive SQL开发指南的一些重要内容。 首先,指南介绍了Hive SQL的基本语法和语义。Hive SQL与传统的关系型数据库SQL有一些差别,指南会详细说明这些差异并提供相应的示例。 其次,在指南中会介绍如何连接到Hadoop集群中的Hive服务并执行SQL查询。这包括配置Hive客户端和服务器的相关参数,并了解如何使用Hive的内置函数和操作符。 指南还会提供如何优化Hive SQL查询性能的建议。Hive查询可能涉及大规模数据处理,因此如何设计和优化查询是非常关键的。指南中会介绍如何使用Hive的分区、索引和优化技巧来提高查询性能。 此外,指南还会涵盖Hive SQL中的数据导入和导出操作。Hive支持从不同的数据源导入和导出数据,指南将介绍如何使用Hive的LOAD、INSERT和EXPORT命令来实现这些操作。 最后,指南还会包含一些常见的Hive SQL开发技巧和实践经验。这些技巧可能包括如何处理复杂查询、如何使用Hive的UDF(用户自定义函数)以及如何利用Hive的可扩展性和容错性等特性。 总之,Hive SQL开发指南提供了关于Hive SQL编程的详细指导,帮助开发者掌握Hive SQL的语法、优化查询性能、实现数据导入导出等操作,并提供一些实际项目中的技巧和经验。这对于想要学习和使用Hive SQL的开发人员来说是一份非常有价值的参考资料。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值