首页 > 数据库 >Hive中如何实现列转行

Hive中如何实现列转行

来源:互联网 2026-07-28 08:39:02

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进行列转行

若需要将压缩后的数据还原为原始的行格式,则需要使用 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处理宽窄表转换的灵活性将远超预期。

侠游戏发布此文仅为了传递信息,不代表侠游戏网站认同其观点或证实其描述

热游推荐

更多
湘ICP备14008430号-1 湘公网安备 43070302000280号
All Rights Reserved
本站为非盈利网站,不接受任何广告。本站所有软件,都由网友
上传,如有侵犯你的版权,请发邮件给xiayx666@163.com
抵制不良色情、反动、暴力游戏。注意自我保护,谨防受骗上当。
适度游戏益脑,沉迷游戏伤身。合理安排时间,享受健康生活。