在Hive中如何实现列转多行?附具体业务场景示例
Hive 固定多SKU列转多行实现方案
实现思路
当前场景为固定列数的宽表转长表,核心通过Hive内置UDTF函数posexplode()实现:
posexplode()可以将数组拆解为多行,同时返回每个元素在数组中的位置索引- 我们将所有sku名称字段、sku数量字段分别按顺序封装为两个数组,通过位置索引匹配就能保证sku名称和对应数量正确关联,避免错乱
实现SQL
假设你的原始表名为original_table,最终转换SQL如下:
SELECT a.index, a.name, b.sku_nm, c.sku_cnt FROM original_table a -- 拆解sku名称数组,返回位置和名称 LATERAL VIEW posexplode(array(sku1_nm, sku2_nm, sku3_nm)) b AS pos, sku_nm -- 拆解sku数量数组,返回位置和数量 LATERAL VIEW posexplode(array(sku1_cnt, sku2_cnt, sku3_cnt)) c AS pos2, sku_cnt -- 位置匹配保证sku名称和数量对应 WHERE b.pos = c.pos2 -- 可选:过滤掉空值的无效sku行 AND b.sku_nm IS NOT NULL AND c.sku_cnt IS NOT NULL;
效果验证
拿你给出的示例数据验证:
原始行数据:index=1、name=dgpark、sku1_nm=box、sku1_cnt=3、sku2_nm=drink、sku2_cnt=2、sku3_nm=choco、sku3_cnt=3
执行SQL后输出3行结果:
- 1 dgpark box 3
- 1 dgpark drink 2
- 1 dgpark choco 3
扩展说明
如果后续原始表新增sku4、sku5等字段,只需要在两个array()参数里按顺序新增对应的skuX_nm、skuX_cnt字段即可,其他逻辑无需修改。
内容的提问来源于stack exchange,提问作者dgpark
相关产品推荐
相关产品推荐

