1. Hive 集合数据类型
数据类型 | 描述 | 语法示例 |
---|---|---|
struct | 通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过 字段名.first来引用。 | struct |
map | MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键->值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 | map(‘first’,‘JOIN’,‘last’,‘Doe’) |
array | 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 | array(‘john’,‘Doe’) |
2. Hive函数
Hive函数大致可以分为三类:UDF(用户自定义函数)、UDAF(用户自定义聚合函数)、UDTF(用户自定义表生成函数)。
3. explode(col):
将hive一列中复杂的array或者map结构拆分成多行。col可以是Hive中集合数据类型中的array或map,不能是struct类型。
4. lateral view:
不支持在select外部使用UDTF函数,这个时候lateral view就可以配合一起使用。
用法:lateral view udtf(expression) 虚拟表别名 AS 列别名
1. 多行变一行
1)准备数据文件及内容: student.txt
xiaoming|english|92.0
xiaoming|chinese|98.0
xiaoming|math|89.5
huahua|chinese|80.0
huahua|math|89.5
2)创建表student:
create table student(name string,subject string,score decimal(4,1))
row format delimited
fields terminated by ‘|’;
3)导入数据:
load data local inpath ‘/home/hadoop/hivetestdata/student.txt’ into table student;
4)多行变一行演示:
select name,concat_ws(',',collect_set(subject))
from student
group by name;
huahua chinese,math
xiaoming english,chinese,math
-- sort_array可用于排序,如sort_array(collect_list(..))
select name,concat_ws(',',collect_set(concat(subject, '=', score)))
from student
group by name;
huahua chinese=80.0,math=89.5
xiaoming english=92.0,chinese=98.0,math=89.5
-- 如果只用collect_set,不使用 concat_ws连接,得到结果是数组
select name,collect_set(subject)
from student
group by name;
huahua [chinese,math]
xiaoming [english,chinese,math]
2. 一行变多行
1)准备原始表数据:
huahua chinese,math
xiaoming english,chinese,math
2)一行变多行演示:
-- split() 将字段分解成array数组
-- explode() 将array数组分解成多行
-- later view 将某数据作为一个虚拟的列
select name,single_subject
from student2
lateral view explode(split(subject,',')) test_subject as single_subject;
xiaoming english
xiaoming chinese
xiaoming math
huahua chinese
huahua math
-- 只使用explode()
select explode(split(subject,',')) from student2;
english
chinese
math
chinese
math
-- 如果多列需要散列,需每列进行lateral view,多个列进行lateral view就是各自的explode做了全连接
select col,newcol1,newcol2
from tablename
lateral view explode(split(col1,',')) tmp as newcol1
lateral view explode(split(col2,',')) tmp as newcol2;
参考链接:
Hive split()、explode()和lateral view 应用单列,多列炸裂
hive一行变多行及多行变一行