Hive中的列转行(Pivot)和行转列(Unpivot)是两种不同的数据转换操作,它们在处理数据时有着不同的目的和效果。
CASE
语句结合GROUP BY
和聚合函数
(如SUM
、AVG
等)来实现列转行的操作。这种转换通常用于将数据从长格式转换为宽格式,使得数据分析更加方便。示例:
假设有一个名为sales_data
的表,其中包含以下列:product_id
、date
和revenue
。我们想要将date
列的值转换为多个新的列,例如year
、month
和day
,并将这些新列的值汇总为每个product_id
的总revenue。可以使用以下Hive SQL语句实现:
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;
LATERAL VIEW
和EXPLODE
函数来实现行转列的操作。这种转换通常用于将数据从宽格式转换为长格式,以便进行更详细的数据分析。示例:
假设有一个名为employee_data
的表,其中包含以下列:employee_id
、department
和salary
。我们想要将每个员工的工资信息转换为多个新的列,例如year
、month
和day
,并将这些新列的值汇总为每个员工的总收入。可以使用以下Hive 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;
总结: