Hive中列转行通过CASEWHEN与GROUPBY将一列不同值转为新列,实现长格式转宽格式;行转列利用LATERALVIEW与EXPLODE将多列拆成多行,完成宽格式转长格式。两者互为逆操作,分别适用于横向对比与纵向分析场景。
先说说Hive里两个特别容易绕晕的操作:列转行和行转列。简单来说,它们就是数据格式的“变形金刚”,一个把数据从“长条”变成“宽块”,另一个反过来把“宽块”拆成“长条”。但到底怎么用、用在什么场景?下面用两个实际案例一次性讲清楚。

长期稳定更新的攒劲资源: >>>点此立即查看<<<
列转行说白了,就是把某一列里不同的值拎出来,变成多个新列。比如原始表里date列记录着2021、2022、2023年的数据,你想按年份分成三列,每列只放对应年份的销售额。这在Hive里怎么干?核心思路就是用CASE WHEN配合GROUP BY和聚合函数(比如SUM)。这种操作通常把“长格式”数据变成“宽格式”,方便横向对比。
举个例子,有个sales_data表,字段是product_id、date和revenue。要是想按年份把收入拆成三列,代码长这样:
SELECT product_id,
SUM(CASE WHEN YEAR(date) = 2021 THEN revenue ELSE 0 END) AS revenue_2021,
SUM(CASE WHEN YEAR(date) = 2022 THEN revenue ELSE 0 END) AS revenue_2022,
SUM(CASE WHEN YEAR(date) = 2023 THEN revenue ELSE 0 END) AS revenue_2023
FROM sales_data
GROUP BY product_id;
行转列方向反过来,把一行里多个列的值拆成多行。比如你有一张employee_data表,里面有employee_id、department和salary,但你想把每个人的工资按年份拆成多条记录。在Hive里常用的办法是LATERAL VIEW加上EXPLODE。这个操作通常把“宽格式”数据变回“长格式”,方便做更细粒度的分析。
还是举个例子。假设employee_data表里每条记录包含多年的工资信息,你希望把2021、2022、2023年的工资都展开成独立行。SQL可以这么写:
SELECT employee_id,
SUM(CASE WHEN YEAR(salary_date) = 2021 THEN salary ELSE 0 END) AS salary_2021,
SUM(CASE WHEN YEAR(salary_date) = 2022 THEN salary ELSE 0 END) AS salary_2022,
SUM(CASE WHEN YEAR(salary_date) = 2023 THEN salary ELSE 0 END) AS salary_2023
FROM employee_data
LATERAL VIEW INLINE(EXPLODE(ARRAY(STRUCT('2021', salary_date, salary),
STRUCT('2022', salary_date, salary),
STRUCT('2023', salary_date, salary)))) t AS year, month, salary
GROUP BY employee_id;
这里稍微复杂一点——利用LATERAL VIEW INLINE把数组里的结构体展开,生成多行数据,再按员工ID聚合。效果就是把原来宽表里的多列salary信息变成按年份拆分的行记录。
总结一下:列转行(Pivot)是把一列里的多个值变成新列,典型场景是长格式转宽格式,方便横向比较;行转列(Unpivot)则是把多列拆成多行,宽格式转长格式,利于纵向分析。两者互为逆操作,选哪个取决于你最终要分析的数据结构。实战中,用CASE WHEN + GROUP BY做Pivot,用LATERAL VIEW + EXPLODE做Unpivot,基本能覆盖90%的需求。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述