case when then else end 行转列/列转行

- 行转列(多行转单列)


-- 数据表 row2col_1:

col1    col2    col3

a      b      1

a      b      2

a      b      3

c      d      4

c      d      5

c      d      6


-- 将其转化为:

col1    col2    col3

a      b      1,2,3

c      d      4,5,6


- 一般使用group by column..+concat_ws+collect_list/collect_set来实现


concat_ws( ‘,’ , collect_list(column))

-- 备注:collect_list不去重,collect_set去重。

a)concat_ws(参数1,参数2),用于进行字符的拼接

参数1—指定分隔符

参数2—拼接的内容

b)collect_set(col3),它的主要作用是将某字段的值进行去重汇总,产生array类型字段


-- column的数据类型是String 如果需要转换为string就使用concat_ws( ‘,’ , collect_list(column as string))


创建表:

create table row2col_1(col1 string,col2 string,col3 int)

row format delimited

fields terminated by ',';


加载数据:

load data local inpath '/root/hivedata/row2col_1.txt' into table row2col_1;

a,b,1

a,b,2

a,b,3

c,d,4

c,d,5

c,d,6


-- 执行代码

select col1, col2, concat_ws('|', collect_set(cast(col3 as string))) as col3

from row2col_1

group by col1, col2;



## - 列转行(针对单列变多行)


数据表 col2row_2:

col1    col2    col3

a      b      1,2,3

c      d      4,5,6


现要将其转化为:

col1    col2    col3

a      b      1

a      b      2

a      b      3

c      d      4

c      d      5

c      d      6


lateral view explode( split ( order_value , ‘ , ‘ )


-- 使用lateral view结合explode这样的UDTF进行实现,由于explode的参数要求是list()或者array()类型,所以往往还需要用到spilt函数进行分割。


-- 创建表:

create table col2row_2(col1 string,col2 string,col3 Array)

row format delimited

fields terminated by '\t'

collection items terminated by ',';


create table col2row_2(col1 string,col2 string,col3 string)

row format delimited

fields terminated by '\t';


--加载数据:

load data local inpath '/root/hivedata/col2row_2.txt' into table col2row_2;

a b 1,2,3

c d 4,5,6


-- 执行语句

select col1, col2, lv.col3 as col3

from col2row_2

lateral view explode(split(col3, ',')) lv as col3;

你可能感兴趣的:(case when then else end 行转列/列转行)