Hive——多行转一行及一行转多行

( 一 )基本概念

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(用户自定义表生成函数)。

  • UDF:一进一出,即 一行数据输入,一行数据输出,如:substring()
  • UDAF: 多进一出,多行数据输入,只有一个结果输出,如:sum()、count()等聚合函数
  • UDTF:一进多出,如现在explode(),可以将一行数据输出为多行结果

3. explode(col):

将hive一列中复杂的array或者map结构拆分成多行。col可以是Hive中集合数据类型中的array或map,不能是struct类型。

4. lateral view:

不支持在select外部使用UDTF函数,这个时候lateral view就可以配合一起使用。

用法:lateral view udtf(expression) 虚拟表别名 AS 列别名

( 二 )hive多行变一行及一行变多行 示例

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一行变多行及多行变一行

你可能感兴趣的:(数据分析,Hive,hive,数据分析)