hive中常用的重要函数,行转列,列转行,开窗,时间函数等等

介绍生产中经常使用的函数

  1. NVL 函数: 给值为NULL的数据赋值
    格式: NVL( value,default_value)
    功能: 如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个 参数都为NULL ,则返回NULL。
    案例:
hive (default)> select comm from emp;
NULL   
300.0   
500.0   
NULL    
1400.0  
NULL    
NULL    
NULL    
NULL    
0.0     
NULL    
NULL    
NULL    
NULL  
hive (default)> select comm,nvl(comm, -1) from emp;
OK
comm    _c1
NULL    -1.0
300.0   300.0
500.0   500.0
NULL    -1.0
1400.0  1400.0
NULL    -1.0
NULL    -1.0
NULL    -1.0
NULL    -1.0
0.0     0.0
NULL    -1.0
NULL    -1.0
NULL    -1.0
NULL    -1.0
  1. case when 条件判断函数,case 开头end 结尾
    格式: case 字段
    when …then …
    else… end

    测试数据
0: jdbc:hive2://hadoop-03:10000> select * from emp_sex;
+---------------+------------------+--------------+--+
| emp_sex.name  | emp_sex.dept_id  | emp_sex.sex  |
+---------------+------------------+--------------+--+
| 张三            | A                | 男            |
| 李四            | A                | 男            |
| 王五            | B                | 男            |
| 赵六            | A                | 女            |
| 麻七            | B                | 女            |
| 王八            | B                | 女            |
+---------------+------------------+--------------+--+

如果是男生标记1,不是男生则标记0

0: jdbc:hive2://hadoop-03:10000> select *, case sex when '男'  then 1 else 0 end from emp_sex;
+---------------+------------------+--------------+------+--+
| emp_sex.name  | emp_sex.dept_id  | emp_sex.sex  | _c1  |
+---------------+------------------+--------------+------+--+
|  张三           | A                | 男            | 1    |
| 李四            | A                | 男            | 1    |
| 王五            | B                | 男            | 1    |
| 赵六            | A                | 女            | 0    |
| 麻七            | B                | 女            | 0    |
| 王八            | B                | 女            | 0    |
+---------------+------------------+--------------+------+--+

求出不同部门男女各多少人:

0: jdbc:hive2://hadoop-03:10000> select dept_id ,sum(case sex when '男' then 1 else 0 end ) as male ,sum(case sex when '女' then 1 else 0 end ) as female
from emp_sex
group by dept_id ;
+----------+-------+---------+--+
| dept_id  | male  | female  |
+----------+-------+---------+--+
| A        | 2     | 1       |
| B        | 1     | 2       |
+----------+-------+---------+--+
  1. 行转列函数
    3.1 函数concat:字符串拼接
    CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串

3.2 concat_ws: 字符串拼接符把字符串拼接
concat_ws(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数是剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;
3.3 collect_set
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
把几行变为一个集合

综合案例

数据 vi constellation.txt

 孙悟空	白羊座	A
大海	     射手座	A
宋宋	     白羊座	B
猪八戒     白羊座	A
凤姐	     射手座	A

要求把星座和血型一样的人归类到一起。结果如下:

射手座,A            大海|凤姐
白羊座,A            孙悟空|猪八戒
白羊座,B            宋宋

按需求查询数据

select
    t1.base,
    concat_ws('|', collect_set(t1.name)) name
from
    (select
        name,
        concat(constellation, ",", blood_type) base
    from
        person_info) t1
group by
    t1.base;
  1. 列转行 函数
    EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
    EXPLODE 作用对象是数组/集合,作用是把数组集合炸开
    而且EXPLODE 是表生成函数,函数作用后生成的是表,不是字段

LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
综合案例

数据

select * from t_wc
tom jerry jim       
nancy baron nancy baron
ivy tom jerry allen

要求结果:hive 计算wordCount

+----------+-------+-
| t1.word  | cnts  |
+----------+-------+-
| allen    | 1     |
| baron    | 2     |
| ivy      | 1     |
| jerry    | 2     |
| jim      | 1     |
| nancy    | 2     |
| tom      | 2     |
+----------+-------+--

代码实现

select t1.word,count(word) cnts
from
(select explode(split(text,' ')) word from t_wc)
t1
group by t1.word;

数据
vi movie.txt

《疑犯追踪》	    悬疑,动作,科幻,剧情
《Lie to me》	   悬疑,警匪,动作,心理,剧情
《战狼2》	      战争,动作,灾难

要求

+--------------+----------------+--+
|    movie     | category_name  |
+--------------+----------------+--+
| 《疑犯追踪》       | 悬疑             |
| 《疑犯追踪》       | 动作             |
| 《疑犯追踪》       | 科幻             |
| 《疑犯追踪》       | 剧情             |
| 《Lie to me》     | 悬疑             |
| 《Lie to me》     | 警匪             |
| 《Lie to me》     | 动作             |
| 《Lie to me》     | 心理             |
| 《Lie to me》     | 剧情             |
| 《战狼2》          | 战争             |
| 《战狼2》          | 动作             |
| 《战狼2》          | 灾难             |
+--------------+----------------+--+

代码

select
    m.movie,
    t1.category_name
from 
    movie_info m lateral view explode(category) t1 as category_name;

这里注意区分表名和别名

总结: 所谓行转列 就是把多行数据变为一行数组的过程,例如concat
列转行就是把数组炸开为多行的过程,例如collect_set

发布了54 篇原创文章 · 获赞 9 · 访问量 1098

猜你喜欢

转载自blog.csdn.net/weixin_43548518/article/details/104093140