本文列举在一些特殊需求下,比如 需要把多行数据根据某一列的字段值转化为字段名的多行转一行的需求 ,或者把 字段名转化为字段值的一行转多行的需求
有点拗口,且看两个实例:

需求一:字段值转化为字段名

将下表
在这里插入图片描述
转化成这样
在这里插入图片描述

方法一:利用str_to_map函数
select name
         ,info['语文'] as Chinese
         ,info['数学'] as Math
         ,info['英语'] as English
  from (select name,str_to_map(concat_ws(',',collect_set(concat_ws(':',subject,cast(score as string))))) as info
          from test
         group by name
方法二:利用case when函数
select name
      ,max(case when subject = '语文' then score else 0 end) as Chinese
      ,max(case when subject = '数学' then score else 0 end) as Math
      ,max(case when subject = '英语' then score else 0 end) as English
  from test
 group by name

需求二:字段名转化为字段值

利用lateral view和explode:
select a.date
      ,b.label
      ,b.value
  from (select *
          from daily_report
     LATERAL VIEW explode (map(
             'UV', uv
             ,'新增UV', newuv 
             ,'视频存量', video
             ,'新增视频', newvideo
             ,'播放量', vv
             ,'会员数', vip_num
             ,'新增会员数', new_vip_num
               )) b as label, value
				
字符串转为map str_to_map(text[, delimiter1, delimiter2]) 使用两个分隔符将文本拆分为键对。 Delimiter1将文本分成K-V对,Delimiter2分割每个K-V对。对于delimiter1默认分隔符是',',对于delimiter2默认分隔符是'='。 select str_to_map('aaa:11&bbb:22', '&amp...
将字符类型数据,转化成map格式的数据 1.1:语法描述 STR_TO_MAP(VARCHAR text, VARCHAR listDelimiter, VARCHAR keyValueDelimiter) 1.2:功能描述 使用listDelimiter将text分隔成K-V对,然后使用keyValueDelimiter分隔每个K-V对,组装成MAP返回。默认listDelimiter为
Hive中的两种行列转换1.将列上的多个打成一行(多列)的行列转换案例一场景一(列转行)场景二(行转列)2.字符串合并与拆分形式的行列转换案例二场景一(列转行)场景二(行转列)总结 1.将列上的多个打成一行(多列)的行列转换 场景一(列转行) 数据如下: name item score 张三 数学 58 张三 英语 83 张三 语文 89 李四 数学 67 李四 英语 35 李四 语文 92 王五 数..
1.concat函数 CONCAT()函数用于将多个字符串连接成一个字符串。 返回结果为连接参数产生的字符串。如有任何一个参数为NULL ,则返回为 NULL。可以有一个或多个参数。 hive> select concat('a','b'); hive> select concat('a','b',null); 2.concat_ws函数 是CONCAT()的特殊形式。第一个参数是其它参...
1、HIVE多行转多列 源数据样式 把CAMERA_NO,RESULT_DATA两列转换为CAMERA_NO字段的数据为列名,RESULT_DATA字段对应CAMERA_NO的数据为 方法一:利用str_to_map函数 alter table ods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results_new add if not exists partition(date='{DATE}' ,hour='{HOUR}',minutes='{MINUTES}'); insert overwrite table ods.iot.iot_5060_io
str_to_map(字符串参数, 分隔符1, 分隔符2) 使用两个分隔符将文本拆分为键对。 分隔符1将文本分成K-V对,分隔符2分割每个K-V对。对于分隔符1默认分隔符是',',对于分隔符2默认分隔符是'=' 我们先介绍一下这个函数应用场景。 Z表又被称之为拉链表。在同一个分区中主键是stat_date+uid被储存的是客户的状态。 我们需要对客户状态进行统计。
字段中jsonStr是一个json格式的字符串,类似于map结构。{"name”:"king", "age":18, "score":99} 使用str_to_map可以转化为map结构。 str_to_map(regexp_replace(regexp_replace(regexp_replace(jsonStr,'\"',''),'\\{',''),'\\}',''), ',', ':'...