hive中行转列,列转行的场景及实现

hive行转列,列转行的应用场景:

1、 需要取“订单号”对应的所有商品“SKU号”,商品“sku号”放在一列,即从table1查询出table2;
2、 当商品“sku号”均在一列的时候,需要查询每个“sku号”对应的“订单号”,即从table2查询出table1。

3、场景:在hive表中,一个用户会有多个人群标签,List格式(逗号分隔如要转成List),有时我们需要统计一个人群标签下有少用户,这是就需要使用行转列。

示例如下:(场景一,场景二)

hive中行转列,列转行的场景及实现_第1张图片

实现方法:
1、从table1查询出table2:

SELECT sale_ord_id, concat_ws(',', collect_set(item_sku_id)) AS item_sku_id
FROM table1
WHERE dt = sysdate(-1)
GROUP BY sale_ord_id


关键点:concat_ws()  、 collect_set() 函数的使用


2、从table2查询出table1:

SELECT sale_ord_id, sku_id
FROM table2
    LATERAL VIEW explode(split(item_sku_id, ',')) adTable AS sku_id
WHERE dt = sysdate(-1)


关键点:explode()、split() 和 LATERAL VIEW  函数 的使用

3、例如,user_crowd_info有如下数据(场景三)

visit_id    crowds
abc         [100,101,102]
def         [100,101]
abe         [101,105]

处理加工方法:

select explode(crowds) as crowd from user_crowd_info;

 

结果:
100
101
102
100
101
101
105

这样执行的结果只有crowd, 但是我们需要完整的信息,使用下面的SQL

SELECT visit_id, crowd
FROM user_crowd_info t
    LATERAL VIEW explode(t.crowds) adtable AS crowd;

如果你写了 select visit_id, explode(crowds) as crowd from user_crowd_info; 这种是不行的哦。

 

列转行的话比较简单,使用concat_ws函数即可,如下表

select visit_id,concat_ws(,crowd) from user_crowd_info group by visit_id;

 

 

下面再举个程序猿的专门测试功能的测试用例情况:

需求:

       通过上面的数据,转换成下面格式的数据,如何操作?

a       b       1
a       b       2
a       b       3
c       d       4
c       d       5
c       d       6

变为:


a       b       1,2,3
c       d       4,5,6

Mock数据,组装表

 

drop table if exists test;
create table test(
col1 string,
col2 string,
col3 string
)
row format delimited fields terminated by '\t'
stored as textfile;

load data local inpath '/home/zhang/test.txt' into table test;

 

操作:

SELECT col1, col2
    , concat_ws(',', collect_set(col3))
FROM test
GROUP BY col1, col2;

 

 

      通过上面的数据,转换成下面格式的数据,如何操作?

a       b       1,2,3
c       d       4,5,6
变为:
a       b       1
a       b       2
a       b       3
c       d       4
c       d       5
c       d       6

Mock数据,组装表

 

drop table if exists test2;
create table test2
(
col1 string,
col2 string,
col3 string
)
row format delimited fields terminated by '\t'
stored as textfile;

 

操作:

SELECT col1, col2, col5
FROM test2 a
    LATERAL VIEW explode(split(col3, ',')) b AS col5

 

ok,就到这里了...下次抽空整理下Hive的窗口函数...

你可能感兴趣的:(大数据,Hive)