列转行,行转列(hivesql)

一、笛卡尔积

笛卡尔积即交叉连接,返回结果的行数等于两个表行数的乘积。
笛卡尔积会出现的可能情况:
1.省略连接条件
2.连接条件无效
3.所有表中的所有数据互相连接

二、列转行

concat_ws():
concat_ws (separator,字符串A/字段名A,字符串B/字段名B…)是concat的特殊形式,第一个参数是其他参数的分隔符,分隔符会放到连接的字符串之间,分隔符可以是一个字符串,也可以是其他参数.如果分隔符为NULL,则结果为NULL,函数会忽略任何分隔符参数后的 NULL值。但是concat_ws( )不会忽略任何空字符串。(然而会忽略所有的 NULL),如果参数为string类型数组则合并数组内字符串
例:concat_ws( ‘,’, [ 'a ', ‘b’, 'c ’ ])–> 'a,b,c ’

collect_set()/collect_list():
collect_set( )函数只接受基本数据类型,作用是对参数字段进行去重汇总,返回array类型字段.
collect_list()函数和collect_set( )作用一样,只是前者不去重,后者去重.

/* 原始数据
name       gender          times
李白         男            唐
程咬金     男            唐
孙悟空     男           神话
猪八戒     男           神话
*/
-- 先用collect_set将列拼接在一起,然后再通过concat_ws进行展开拼接
select a.g_t, concat_ws( '-',collect_set(a.name ) ) name
from
( select name, concat ( gender, ', ''times) g_t
from
hero_info
) a
group by a.g_t;
/*查询结果
男,唐     李白-程咬金
男,神话   孙悟空,猪八戒 
*/
三、行转列

split()︰将一个字符串按照指定字符分割,结果为一个array
explode():将一列复杂的array或者map拆分为多行,它的参数必须为map或array
lateral view用法: lateral view udtf(字段名)表别名/表临时名as列别名/列临时名

lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateralview再把结果组合,产生一个支持别名表的虚拟表。

/*原始数据
province                                    city
河南                                 郑州市,开封市,洛阳市
河北                                 石家庄市,保定市,邢台市
湖南                                 长沙市,岳阳市,常德市
*/
-- addr为表名
select province, city_n  from
addr         lateral view
explode ( split(city,',' ) ) addr_tmp as city_n;

/*
-- 查询结果
河南      郑州市
河南      开封市
河南      洛阳市
河北      石家庄市
河北       保定市
河北      邢台市
湖南       长沙市
湖南       岳阳市
湖南       常德市
*/

你可能感兴趣的:(笔记,hive,sql)