当前位置:   article > 正文

hive的行转列和列转行_hive 行转列

hive 行转列

目录

一、行转列

1.函数说明

concat

concat_ws

collect_set

2.数据准备

3.需求

4.数据准备

创建本地constellation.txt,导入数据 

创建hive表

向表中导入数据

验证表数据

5.按需求查询数据

第一步

第二步

二.列转行

1.函数说明

split

explode

lateral view

2.数据准备

 3.需求

 4.数据准备

创建本地movie.txt,导入数据

创建hive表

向表中导入数据

验证表数据

5.按需求查询数据

第一步

第二步

6.情况简单下,多用如下方式


一、行转列

1.函数说明

  • concat

CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,...):它是一个特殊形式的 CONCAT()。第一个参数剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

2.数据准备

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

3.需求

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

 在这里插入图片描述

4.数据准备

  • 创建本地constellation.txt,导入数据 

  1. [root@hadoop dool]# vim constellation.txt
  2. 孙悟空 白羊座 A
  3. 大海 射手座 A
  4. 宋宋 白羊座 B
  5. 猪八戒 白羊座 A
  6. 凤姐 射手座 A
  • 创建hive表

  1. create table person_info(
  2. name string,
  3. constellation string,
  4. blood_type string)
  5. row format delimited fields terminated by "\t";
  • 向表中导入数据

  1. load data local inpath "/usr/word/dool/constellation.txt"
  2. into table person_info;
  • 验证表数据

select * from person_info;

导入成功,如下:

  1. 0: jdbc:hive2://192.168.171.151:10000> select * from person_info;
  2. +-------------------+----------------------------+-------------------------+--+
  3. | person_info.name | person_info.constellation | person_info.blood_type |
  4. +-------------------+----------------------------+-------------------------+--+
  5. | 孙悟空 | 白羊座 | A |
  6. | 大海 | 射手座 | A |
  7. | 宋宋 | 白羊座 | B |
  8. | 猪八戒 | 白羊座 | A |
  9. | 凤姐 | 射手座 | A |
  10. | | NULL | NULL |
  11. +-------------------+----------------------------+-------------------------+--+
  12. 6 rows selected (1.343 seconds)

5.按需求查询数据

第一步

将星座(constellation)和血型(blood_type)用逗号连接

  1. 0: jdbc:hive2://192.168.171.151:10000> select
  2. . . . . . . . . . . . . . . . . . . > name,
  3. . . . . . . . . . . . . . . . . . . > concat(constellation,",",blood_type) base
  4. . . . . . . . . . . . . . . . . . . > from
  5. . . . . . . . . . . . . . . . . . . > person_info;
  6. +-------+--------+--+
  7. | name | base |
  8. +-------+--------+--+
  9. | 孙悟空 | 白羊座,A |
  10. | 大海 | 射手座,A |
  11. | 宋宋 | 白羊座,B |
  12. | 猪八戒 | 白羊座,A |
  13. | 凤姐 | 射手座,A |
  14. | | NULL |
  15. +-------+--------+--+
  16. 6 rows selected (1.072 seconds)

第二步

在第一步的基础上根据星座,血型(base)进行分组,通过collect_set将同组多行数据根据name字段聚合成一个数组,再通过concat_ws对数组进行拆分拼接

  1. 0: jdbc:hive2://192.168.171.151:10000> select t1.base,
  2. . . . . . . . . . . . . . . . . . . > concat_ws("|",collect_set(t1.name)) name
  3. . . . . . . . . . . . . . . . . . . > from
  4. . . . . . . . . . . . . . . . . . . > (select
  5. . . . . . . . . . . . . . . . . . . > name,
  6. . . . . . . . . . . . . . . . . . . > concat(constellation,",",blood_type) base
  7. . . . . . . . . . . . . . . . . . . > from
  8. . . . . . . . . . . . . . . . . . . > person_info) t1
  9. . . . . . . . . . . . . . . . . . . > group by t1.base;
  10. +----------+----------+--+
  11. | t1.base | name |
  12. +----------+----------+--+
  13. | NULL | |
  14. | 射手座,A | 大海|凤姐 |
  15. | 白羊座,A | 孙悟空|猪八戒 |
  16. | 白羊座,B | 宋宋 |
  17. +----------+----------+--+
  18. 4 rows selected (40.1 seconds)

二.列转行

1.函数说明

  • split

Split(str, separator):将字符串按照后面的分隔符切割,转换成字符array。

  • explode

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

  • lateral view

用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

2.数据准备

原数据表如下图

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

 3.需求

将电影分类中的数组数据展开。结果如下:

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

 4.数据准备

  • 创建本地movie.txt,导入数据

  1. [root@hadoop dool]# vim movie.txt
  2. 《疑犯追踪》 悬疑,动作,科幻,剧情
  3. 《Lie to me》 悬疑,警匪,动作,心理,剧情
  4. 《战狼2》 战争,动作,灾难
  • 创建hive表

  1. create table movie_info(
  2. movie string,
  3. category string)
  4. row format delimited fields terminated by "\t"
  5. collection items terminated by ",";
  • 向表中导入数据

  1. load data local inpath "/usr/word/dool/movie.txt"
  2. into table movie_info;

验证表数据

  1. 0: jdbc:hive2://192.168.171.151:10000> select * from movie_info;
  2. +-------------------+-----------------------------+--+
  3. | movie_info.movie | movie_info.category |
  4. +-------------------+-----------------------------+--+
  5. | 《疑犯追踪》 | ["悬疑","动作","科幻","剧情"] |
  6. | 《Lie to me》 | ["悬疑","警匪","动作","心理","剧情"] |
  7. | 《战狼2》 | ["战争","动作","灾难"] |
  8. | | NULL |
  9. +-------------------+-----------------------------+--+
  10. 4 rows selected (0.204 seconds)

5.按需求查询数据

第一步

用split将category切分成数组,用explode函数将category数组炸开

  1. 0: jdbc:hive2://192.168.171.151:10000> select
  2. . . . . . . . . . . . . . . . . . . > explode(split(category,','))
  3. . . . . . . . . . . . . . . . . . . > from movie_info;
  4. +------+--+
  5. | col |
  6. +------+--+
  7. | 悬疑 |
  8. | 动作 |
  9. | 科幻 |
  10. | 剧情 |
  11. | 悬疑 |
  12. | 警匪 |
  13. | 动作 |
  14. | 心理 |
  15. | 剧情 |
  16. | 战争 |
  17. | 动作 |
  18. | 灾难 |
  19. +------+--+
  20. 12 rows selected (0.158 seconds)

第二步

用lateral view函数对原表的movie字段对炸开表进行侧写

  1. 0: jdbc:hive2://192.168.171.151:10000> select
  2. . . . . . . . . . . . . . . . . . . > movie,
  3. . . . . . . . . . . . . . . . . . . > category_name
  4. . . . . . . . . . . . . . . . . . . > from movie_info
  5. . . . . . . . . . . . . . . . . . . > lateral view
  6. . . . . . . . . . . . . . . . . . . > explode(split(category,',')) movie_tmp AS category_name;
  7. +--------------+----------------+--+
  8. | movie | category_name |
  9. +--------------+----------------+--+
  10. | 《疑犯追踪》 | 悬疑 |
  11. | 《疑犯追踪》 | 动作 |
  12. | 《疑犯追踪》 | 科幻 |
  13. | 《疑犯追踪》 | 剧情 |
  14. | 《Lie to me》 | 悬疑 |
  15. | 《Lie to me》 | 警匪 |
  16. | 《Lie to me》 | 动作 |
  17. | 《Lie to me》 | 心理 |
  18. | 《Lie to me》 | 剧情 |
  19. | 《战狼2》 | 战争 |
  20. | 《战狼2》 | 动作 |
  21. | 《战狼2》 | 灾难 |
  22. +--------------+----------------+--+
  23. 12 rows selected (0.166 seconds)

6.情况简单下,多用如下方式

  • 创建hive表
  1. create table movie_info2(
  2. movie string,
  3. category (split<string>))
  4. row format delimited fields terminated by "\t"
  5. collection items terminated by ",";
  • 查询数据
  1. 0: jdbc:hive2://192.168.171.151:10000> select
  2. . . . . . . . . . . . . . . . . . . > movie,
  3. . . . . . . . . . . . . . . . . . . > category_name
  4. . . . . . . . . . . . . . . . . . . > from movie_info
  5. . . . . . . . . . . . . . . . . . . > lateral view
  6. . . . . . . . . . . . . . . . . . . > explode (category) movie_tmp AS category_name;
  7. +--------------+----------------+--+
  8. | movie | category_name |
  9. +--------------+----------------+--+
  10. | 《疑犯追踪》 | 悬疑 |
  11. | 《疑犯追踪》 | 动作 |
  12. | 《疑犯追踪》 | 科幻 |
  13. | 《疑犯追踪》 | 剧情 |
  14. | 《Lie to me》 | 悬疑 |
  15. | 《Lie to me》 | 警匪 |
  16. | 《Lie to me》 | 动作 |
  17. | 《Lie to me》 | 心理 |
  18. | 《Lie to me》 | 剧情 |
  19. | 《战狼2》 | 战争 |
  20. | 《战狼2》 | 动作 |
  21. | 《战狼2》 | 灾难 |
  22. +--------------+----------------+--+
  23. 12 rows selected (0.13 seconds)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/人工智能uu/article/detail/894891
推荐阅读
相关标签
  

闽ICP备14008679号