hive 行转列和列转行的方法

本文详细介绍了Hive中行转列与列转行的操作方法,包括建表、数据处理及示例代码,适用于数据处理场景。

一、行转列的使用

1、问题

hive如何将

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

 

2、数据

test.txt

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

 

3、答案

1.建表

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


load data local inpath '/home/jiangzl/shell/test.txt' into table tmp_jiangzl_test;

 

2.处理

 

select col1,col2,concat_ws(',',collect_set(col3)) 
from tmp_jiangzl_test  
group by col1,col2;

 

二、列转行

 

1、问题

hive如何将

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

 

2、答案

1.建表

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


处理:

 

select col1, col2, col5

from tmp_jiangzl_test a 

lateral  view explode(split(col3,','))  b AS col5

 

本文行转列的例子引自:http://my.oschina.net/repine/blog/295961

### Hive行转列转行的实现 #### 行转列Hive 中,可以通过 `collect_list` 或者 `concat_ws` 函数来实现行转列的操作。这些函数可以将多行的数据聚合为单个字符串。 以下是通过 `concat_ws` `group by` 的方式实现行转列的一个例子: ```sql -- 假设有一个表 hero,结构如下: -- hero_name hero_type -- Iron Man Superhero -- Batman Superhero -- Joker Villain SELECT hero_type, CONCAT_WS(',', COLLECT_LIST(hero_name)) AS heroes FROM hero GROUP BY hero_type; ``` 此查询会将相同类型的英雄名称拼接成一个逗号分隔的字符串[^3]。 --- #### 转行 对于转行的操作,在 Hive 中通常使用 `LATERAL VIEW` 配合 `EXPLODE` 函数完成。这种组合能够将数组或者映射中的元素展开为单独的行。 下面是一个基于数组字段的例子: ```sql -- 创建一张电影分类表 movie_info CREATE TABLE movie_info ( movie STRING, category ARRAY<STRING> ) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' COLLECTION ITEMS TERMINATED BY ','; -- 导入数据到 movie_info 表中 LOAD DATA LOCAL INPATH '/home/hadoop/file/movie_info' INTO TABLE movie_info; -- 查询每部电影及其对应的类别(转行为行) SELECT movie, categ FROM movie_info LATERAL VIEW EXPLODE(category) mv_table AS categ; ``` 在此示例中,`category` 是一个数组类型字段,而 `EXPLODE` 将其拆分为多个独立的行[^2]。 另外一种情况涉及键值对形式的映射数据处理时,则可采用类似的逻辑: ```sql -- 使用 STR_TO_MAP 构造映射并将其转换为行的形式 SELECT key_value_pair.key, key_value_pair.value FROM (SELECT str_to_map(concat('valid_num=', valid_num, '&invalid_num=', invalid_num), '&', '=') as kv FROM test_rowcol) t1 LATERAL VIEW explode(kv) exploded_kv AS key, value; ``` 这里展示了如何利用 `STR_TO_MAP` 结合 `CONCAT` 来构建映射对象,并进一步借助 `EXPLODE` 方法解析出各个键值对作为新记录展示出来[^1]。 --- ### 总结说明 无论是行转列还是转行Hive 提供了丰富的内置功能支持复杂的数据变换需求。具体来说,“行转列”的核心在于运用集合类聚集函数如 `COLLECT_SET`, `COLLECT_LIST` 加上连接符串接;而对于“转行”,则更多依赖于解构工具像 `EXPLODE()` 这样的辅助视图机制配合特定场景下的自定义表达式构造。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值