Hive中列转行利用UNNEST配合LATERALVIEW展开数组,而行转列通过COLLECT_LIST与GROUPBY聚合,两者形成“压缩-解压”对称关系,灵活实现宽表与窄表之间的相互转换,适用于ETL与数据重构场景。
在Hive中实现列转行,许多开发者首先联想到的是与行转列相反的操作。实际上,将一行中的多个值拆分为多行,有一个非常便捷的方法:UNNEST。它能够将数组中的元素逐一展开,如同将一袋糖果倒出,每颗单独摆放。
考虑一个具体的销售数据表 sales_data,其结构如下:
长期稳定更新的攒劲资源: >>>点此立即查看<<<
CREATE TABLE sales_data (
product_id INT,
sale_date STRING,
quantity INT
);
现在需要将该表转换为宽格式,即每个产品ID与日期组合仅占一行,但将不同日期的销量放置在不同的列中。这类似于Excel中的透视表。在Hive中,可以通过 COLLECT_LIST 配合 GROUP BY 实现:
SELECT
product_id,
COLLECT_LIST(sale_date) AS sale_dates,
COLLECT_LIST(quantity) AS quantities
FROM sales_data
GROUP BY product_id;
执行后,每个 product_id 对应一个日期列表和销量列表,数据被压缩到两列中。
若需要将压缩后的数据还原为原始的行格式,则需要使用 UNNEST。在Hive中,使用 UNNEST 前通常需要将数据写入辅助表,或直接通过子查询处理。操作路径如下:
首先创建辅助表(或使用CTE),将原始数据存入:
CREATE TABLE sales_data_unneasted AS
SELECT product_id, sale_date, quantity
FROM sales_data;
然后通过CTE与 UNNEST 拆分数组:
WITH product_sales AS (
SELECT
product_id,
sale_date,
quantity
FROM sales_data_unneasted
),
unnested_sales AS (
SELECT
product_id,
UNNEST(sale_dates) AS sale_date,
UNNEST(quantity) AS quantity
FROM product_sales
)
SELECT product_id, sale_date, quantity
FROM unnested_sales;
最终结果将每个产品ID、日期和数量恢复为独立的一行,与最初的 sales_data 表结构完全相同。在实际应用中,可能需要先完成行转列(使用 COLLECT_LIST),再执行列转行(使用 UNNEST),关键在于理解这种“压缩-解压”的对应关系。熟练掌握后,Hive处理宽窄表转换的灵活性将远超预期。
侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述