返回 导航

大数据

hangge.com

Hive - 快速入门教程6(高级函数2:行传列、列传行)

作者:hangge | 2024-09-19 08:31

二、行传列

1,函数说明

    行转列就是把多行数据转为一列数据。针对行转列这种需求主要需要使用到 CONCAT_WS()COLLECT_SET()COLLECT_LIST() 函数:
  • CONCAT_WS() 函数可以实现根据指定的分隔符拼接多个字段的值,最终转化为一个带有分隔符的字符串。该函数可以接收多个参数,第一个参数是分隔符,后面的参数可以是字符串或者字符串数组,最终就是使用分隔符把后面的所有字符串拼接到一块。
  • COLLECT_LIST() 函数可以返回一个 list 集合,集合中的元素会重复,一般和 group by 结合在一起使用。
  • COLLECT_SET() 函数可以返回一个 set 集合,集合汇中的元素不重复,一般和 group by 结合在一起使用。

2,准备工作

(1)student_favors.data 文件中存储了学生的爱好数据,内容如下:

(2)我们对原始数据进行建表:
create external table student_favors(
  name string,
  favor string
)
row format delimited
fields terminated by '\t'
location '/data/student_favors';

(3)然后上传数据:
load data local inpath '/usr/local/student_favors.data' into table student_favors;

(4)查询一下表数据,目前结果如下:
select * from student_favors;

3,行转列示例

(1)下面查询时使用 Hive 函数实现行转列效果:
  • 首先对 name 字段进行分组,把 favor 转成一个数组。
  • 然后再使用 concat_ws 把数组中的元素按照指定分隔符转成字符串,这样就实现了多行数据转为一列数据了。
select name,concat_ws(',',collect_list(favor)) as favor_list from student_favors group by name;

(2)我们发现这里面有一些爱好是重复的,如果不希望出现重复的话可以使用 COLLECT_SET()
select name,concat_ws(',',collect_set(favor)) as favor_list from student_favors group by name;

三、列传行

1,函数说明

    列转行是和上面的行转列反着来的,列转行可以把一列数据转成多行,主要使用到 SPLIT()EXPLODE() LATERAL VIEW
  • split 函数,接受一个字串符和切割规则,就类似于 java 中的 split 函数,使用切割规则对字符串中的数据进行切割,最终返回一个 array 数组。
  • explode 函数可以接受 array 或者 map
    • explode(ARRAY):表示把数组中的每个元素转成一行
    • explode(MAP) :表示把 map 中每个 key-value 对,转成一行,key 为一列,value 为一列
  • lateral view 通常和 splitexplode 等函数一起使用。split 可以对表中的某一列进行切割,返回一个数组类型的字段,explode 可以对这个数组中的每一个元素转为一行,lateral view 可以对这份数据产生一个支持别名的虚拟表

2,准备工作

(1)student_favors_2.data 文件中存储了学生的爱好数据,内容如下:

(2)我们对原始数据进行建表:
create external table student_favors_2(
  name string,  
  favorlist string
)
row format delimited 
fields terminated by '\t'
location '/data/student_favors_2';

(3)然后上传数据:
load data local inpath '/usr/local/student_favors_2.data' into table student_favors_2;

(4)查询一下表数据,目前结果如下:
select * from student_favors_2;

3,行转列示例

(1)下面查询时使用 Hive 函数实现列转行效果:
  • 首先使用 splitfavorlist 字段进行切割
  • 接着使用 explode 对数据进行操作
  • 最后使用 lateral viewname 字段拼接上,否则直接查询 name 字段会报错。
提示lateral view 相当于把 explode 返回的数据作为一个虚拟表来使用了,起名字为 table1,然后给这个表里面的那一列数据起一个名字叫 favor_new,如果有多个字段,可以再后面指定多个。这样在 select 后面就可以使用这个名字了,有点类似 join 操作了
select name,favor_new from student_favors_2 lateral view explode(split(favorlist, ',')) table1 as favor_new ;

(2)运行结果如下:
评论

全部评论(0)

回到顶部