hive中的行转列,列转行

行转列:
1.行转列所用的函数
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串;

CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数作为剩余参数间的分隔符。分隔符可以是与剩余参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间;

COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段(也就是将一列字段去重以后放在一个数组中)。

hive中的行转列,列转行_第1张图片

案例分析:原数据为用户的姓名,住址,年龄(中间为\t分割)。

hive中的行转列,列转行_第2张图片

目标数据:(先将住址和年龄合并成一列数据,再将住址和年龄相同的用户放到一起形成如下的表)

hive中的行转列,列转行_第3张图片

思路分析:1.先将住址和年龄合并成一列数据
hive中的行转列,列转行_第4张图片

2.按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行。

实际操作:
1.建表:

create table usertab(
name string, 
address string, 
age string) 
row format delimited fields terminated by "\t";

2.导入数据并查询:

load data local inpath '/opt/demo.txt' into table usertab;

hive中的行转列,列转行_第5张图片

接上面思路分析第一步:先将住址和年龄合并成一列数据

select name,concat_ws(',',address,age) address_age from usertab;

hive中的行转列,列转行_第6张图片
第二步:按照住址和年龄分组,然后用COLLECT_SET(col)函数将用户名变为一行,最后用concat_ws()函数来连接用户名字。

select address_age,concat_ws('-',collect_set(name)) from (select name,concat_ws(',',address,age) address_age from usertab) t group by address_age;

最终结果:

hive中的行转列,列转行_第7张图片

列转行:

EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。
LATERAL VIEW
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:用于和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

案例:原数据为姓名和喜欢吃的水果(\t分割字段)

hive中的行转列,列转行_第8张图片

目标数据,将原数据中每个人喜欢吃的水果分成多行,如下为目标数据。

hive中的行转列,列转行_第9张图片

1.创建表并且导入数据

create table fruit(
    name string,
    like_fruits  array<string>)
row format delimited fields terminated by "\t"
collection items terminated by ",";
load data local inpath "/opt/fruit.txt"  into table fruit;

hive中的行转列,列转行_第10张图片

查询数据的sql

select
    name,
    like_fruits_name
from
    fruit lateral view explode(like_fruits) table_tmp as like_fruits_name;

hive中的行转列,列转行_第11张图片

这里需要注意的是函数explode(like_fruits)的别名是在as 后面,table_tmp为explode函数将like_fruits字段中的值分解后形成的表。

你可能感兴趣的:(hive)