前提
使用的是如下信息表进行操作以及展示:
select * from test_daniel
其展示结果为:
列转行
使用函数:concat_ws(‘split_type’,collect_list(column))
规范代码格式:
select column1,
concat_ws('split_type',collect_list(column2)) as new_column_name
from table_name
group by column1
-- 语法含义:把相同的 column1 中的 column2 信息按照'split_type'分割转为一行,新列命名为new_column_name
-- 'split_type' 可使用:,;等
实例展示:
把相同的loadDate中的line信息按照逗号 (,) 分割转为一行
select loadDate,
concat_ws(',',collect_list(line)) as line_value
from test_daniel
group by loadDate
其展示结果为:
这里也可以使用 concat_ws(‘split_type’,collect_set(column)) 函数
select loadDate,
concat_ws(',',collect_set(line)) as line_value
from test_daniel
group by loadDate
-- collect_set去重;collect_list 不去重
其展示结果为:
行转列
使用 lateral view explode(split(column2,‘split_type’))函数
select column1,column2,column_split
from table_name
lateral view explode(split(column2,'split_type')) as column_split
-- Column1:key列
-- Column2:需要被分割的列,使用lateral view explode(split(column2,'split_type')) 函数
---其中'split_type'根据什么进行分割,如,;等
-- Column_split:分割后的新列
实例展示:
把一行中loadDate中的line_value信息按照逗号 (,) 分割转为多行
with cte as(
select loadDate,
concat_ws(',',collect_list(line)) as line_value
from test_daniel
group by loadDate
)
select loadDate,line_value,order_id
from cte
lateral view explode(split(line_value,',')) as order_id
-- order_id分割成多行后的数据
-- line_value:一行中原始按照','进行分割的数据
-- loadDate:key列
其展示结果为: