当前位置:   article > 正文

HIVE行转列和列转行_hive列转行

hive列转行

行转列

select dt_month,valid_num,unvalid_num from test.test_xw_rowtocol

数据如下


转换要求:行转列需保留列名,如下图


方式一:采用union all的形式

  1. select
  2. dt_month
  3. ,'valid_num' as type
  4. ​ ,sum(valid_num) as num
  5. from temp.temp_xw_rowtocol
  6. group by dt_month​
  7. union all
  8. select
  9. dt_month
  10. ,'unvalid_num' as type
  11. ​ ,sum(unvalid_num) as num
  12. from temp.temp_xw_rowtocol
  13. group by dt_month​
方式二:使用lateral view和str_to_map

  1. select
  2. a.dt_month
  3. ,add_t.type
  4. ,add_t.num
  5. from temp.temp_xw_rowtocol a
  6. lateral view explode(str_to_map(concat('valid_num=',valid_num
  7. ,'&unvalid_num=',unvalid_num
  8. ),'&','='
  9. )
  10. ) add_t as type,num

方式三:思路和方式二一致,稍微简单点,缺点只能含explode函数(列名称默认key和value也可自定义)

  1. select
  2. explode(str_to_map(concat('valid_num=',valid_num
  3. ,'&unvalid_num=',unvalid_num
  4. ),'&','='
  5. )
  6. )
  7. from temp.temp_xw_rowtocol a
  8. ;

ps:方式一在指标少时方便使用,当行转列的指标比较多时代码量会比较大,维护困难

      方式二极大的减少重复的代码量,需要熟悉lateral view和str_to_map,concat等函数使用,concat主要拼接key-value形式存储的字符串,如在一个项目开发中使用一个sql处理出十多个指标,后期需要列存储各指标值时,使用方式二就可以使代码减少数10倍,极大提升代码可读性和可维护性,同时key值可以自定义。

列转行

通过group by

  1. select
  2. a.dt_month
  3. ,sum(case when type = 'valid_num' then num end) as valid_num
  4. ,sum(case when type = 'unvalid_num' then num end) as unvalid_num
  5. from temp.temp_xw_coltorow a
  6. group by a.dt_month

具体HIVE函数参考官方WIKI: 点击打开链接


声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/894907
推荐阅读
相关标签
  

闽ICP备14008679号