写在前面:
自己用hive已经两个多月了,写hql来完成需求。下面是我的一些心得
Hive类型
hive基本类型这里不介绍,很基本。除了基本类型还有array,map,struct类型其中在工作中array和map使用的还是比较多的。下面举例介绍和说明.。
Hive函数:
在hive命令行中输入 show functions可以看到hive内置的所有函数,当然你也可以自定义函数这个在后面的文章里会讲到
当你觉得某些功能实现需要用到hive内置函数的时候,可以用show functions like '*array*'会发现出现了array()这个函数然后用desc function array可以查看arry()函数的具体用法
##下面结合工作中的例子来说明
#表一 表示手机号码字段和手机号码打的标志比如集团号,外卖号。一个手机号码可以对应多个标记值
create table tb1(
phone string,
tag_value string
)
row format delimited fields terminated by '/t'
stored as textfile
#数据如下
17743414322 aaa
17743414322 bbb
18843414322 aaa
18843414322 bbb
19943414322 aaa
#手机号码和标注的全量表
create table tb_all
(
phone stirng,
tag_value string
)
row format delimited fields terminated by '/t'
stored as textfile
##数据如下
17743414322 aaa
17743414322 ccc
18843414322 aaa
18843414322 ccc
##要求,找出tb1中 在全量表中新增的记录和修改的记录(修改的记录为增加了手机号码标注)
eg:19943414322 aaa 是新增的记录
17743414322 aaa,bbb,ccc 表示修改的记录(以这种形式展现)新增和更新的记录都放到一张表中。
##step1找出新增的数据
select tb1.phone,tb1.tag_value
from
tb1 left outer join tb_all
on tb1.phone = tb_all.phone
where tb_all.phone is null
#效果如下所示
19943414322 aaa
# sql讲解,用到left outer join 可以用来筛选出两张表不同的记录和相同的记录,工作中用的很多
##step2找出更新的数据
#step2-1
select tb1.phone,concat_ws(',',split(tb1.tag_value,','),concat_ws(',',split(tb_all.tag_value,',')))
from tb1 inner join tb_all
on tb1.phone=tb_all.phone
#效果如下
17743414322 123,aaa
17743414322 123,ccc
17743414322 bbb,aaa
17743414322 bbb,ccc
18843414322 aaa,aaa
18843414322 aaa,ccc
18843414322 bbb,aaa
18843414322 bbb,ccc
#hql解释
1:concat_ws()函数用指定的连接符来连接给定的字符串或者集合
2:split() 函数用指定的正则表达式来切分字符串
#step2-2