Hive列转行:简化数据分析技巧
Hive中利用LATERALVIEW与EXPLODE可将数组类型字段展开为多行,实现列转行操作。此方法能有效处理分类标签等列表字段,使数据更灵活,便于后续聚合分析,避免复杂自关联,提升数据处理效率。
常见场景:列转行需求
在数据分析和处理的日常工作中,我们经常会遇到这样一个场景:一张表里明明存着完整的信息,可要做聚合或交叉分析时,却总觉得数据“躺着不动”,差那么一口气。比如某个字段里存储了多个分类标签,但你真正需要的却是每个标签单独成行。这时候,Hive 里的 LATERAL VIEW 和 EXPLODE 这对黄金搭档,就能帮你把列“掰开来”变成行,让数据瞬间变灵活。

示例数据准备
拿一个实际的例子来说。假设我们有一张 user_data 表,里面有四个字段:user_id、item_id、category 和 rating。看起来平平无奇,但如果我们想知道每个用户对每个商品在不同分类下的评分情况,直接查原始表是不够的——因为 category 字段本身是一个整体,无法直接对每个分类做单独的计算。所以,第一步先造点数据看看:
CREATE TABLE user_data (user_id INT,item_id INT,category STRING,rating FLOAT);
INSERT INTO user_data VALUES
(1, 101, 'A', 4.5),
(1, 102, 'B', 3.0),
(2, 101, 'A', 5.0),
(2, 103, 'C', 4.0);
使用 LATERAL VIEW EXPLODE 实现列转行
现在,用 LATERAL VIEW EXPLODE 把 category 这个列拆开——其实这里 category 本身就是单值,但为了演示逻辑,我们把它包成数组再爆炸。写法是这样的:
SELECT
user_id,
item_id,
category,
rating
FROM
user_data
LATERAL VIEW
EXPLODE(ARRAY(category)) categories AS category;
跑完之后,结果看起来和原表几乎一样——因为每个 category 原本就是单个值,爆炸后仍然是一行。但原理上,你已经把列转成了行。实际业务中,如果你有类似 ['A','B','C'] 这样的数组字段,一个 EXPLODE 就能展开成三行,这才是它的威力所在。输出如下:
user_id | item_id | category | rating
--------+---------+----------+-------
1 | 101 | A | 4.5
1 | 102 | B | 3.0
2 | 101 | A | 5.0
2 | 103 | C | 4.0
后续分析应用
数据拆开后,后续的分析就顺手多了。比如,想求每个用户在每个商品上的平均评分,直接用子查询加上 GROUP BY 就能搞定:
SELECT
user_id,
item_id,
A VG(rating) AS a vg_rating
FROM (
SELECT
user_id,
item_id,
category,
rating
FROM
user_data
LATERAL VIEW
EXPLODE(ARRAY(category)) categories AS category
) sub
GROUP BY
user_id,
item_id;
结果依然清晰:
user_id | item_id | a vg_rating
--------+---------+-----------
1 | 101 | 4.5
1 | 102 | 3.0
2 | 101 | 5.0
2 | 103 | 4.0
总结
说到底,Hive 里列转行并不是什么高深技巧,但却是一个非常实用的数据预处理手段。当你的字段里藏着列表或需要按某维度展开分析时,LATERAL VIEW 加上 EXPLODE 绝对是你工具箱里值得常备的一把钥匙。用好它,很多原本需要写复杂自关联或自定义 UDF 的场景,一个 SQL 就能搞定。
