1、HIVE多行转多列源数据样式
把CAMERA_NO,RESULT_DATA两列转换为CAMERA_NO字段的数据为列名,RESULT_DATA字段对应CAMERA_NO的数据为值
方法一:利用str_to_map函数
altertableods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results_newaddifnotexistspartition(date='{DATE}',hour='{HOUR}',minutes='{MINUTES}'); insertoverwritetableods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results_newpartition(date='{DATE}',hour='{HOUR}',minutes='{MINUTES}') select LOT_NO, LOT_NAME, MEASURE_NO, info['S1']ASS1, info['S2']ASS2, info['S3']ASS3, info['S4']ASS4, CREATEDATE, CREATETIME from ( selectLOT_NO,LOT_NAME,MEASURE_NO,str_to_map(concat_ws(',',collect_set(concat_ws(':',CAMERA_NO,RESULT_DATA))))asinfo,CREATEDATE,CREATETIME FROMods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results wheredate='{DATE}'andhour='{HOUR}'andminutes='{MINUTES}' groupbyLOT_NO,LOT_NAME,MEASURE_NO,CREATEDATE,CREATETIME )a转换后结果为
方法二:利用casewhen函数
selectLOT_NO,LOT_NAME,MEASURE_NO,max(casewhenCAMERA_NO='S1'thenRESULT_DATAelsenullend)asS1, max(casewhenCAMERA_NO='T1'thenRESULT_DATAelsenullend)asT1,CREATEDATE,CREATETIME fromods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results groupbyLOT_NO,LOT_NAME,MEASURE_NO,CREATEDATE,CREATETIME
hivesql之str_to_map函数
str_to_map(字符串参数,分隔符1,分隔符2)
使用两个分隔符将文本拆分为键值对。
分隔符1将文本分成K-V对,分隔符2分割每个K-V对。对于分隔符1默认分隔符是‘,’,对于分隔符2默认分隔符是‘=’
取用map里的字段,用[""]即可
可以直接转换取用,而不需要存储字段
selectLOT_NO,LOT_NAME,MEASURE_NO,str_to_map(concat_ws(',',collect_set(concat_ws(':',CAMERA_NO,RESULT_DATA))))asinfo,CREATEDATE,CREATETIME FROMods.iot.iot_5060_iotdaq.5060_aac_mtf_meas_results groupbyLOT_NO,LOT_NAME,MEASURE_NO,CREATEDATE,CREATETIME LIMIT1查询结果为
concat、concat_ws、group_concat函数
concat()函数可以连接一个或者多个字符串
concat_ws(separator,str1,str2)第一个参数是其它参数的分割符,分割符的位置放在要连接的两个字符串之间。
group_concat()分组拼接函数
group_concat([DISTINCT]要连接的字段[orderbyasc/desc排序字段][Separator‘分隔符’])
Hive之collect_list和collect_set
将分组中的某列转为一个数组返回,不同的是collect_list不去重而collect_set去重
select*fromtv
在这里插入图片描述
selectusername,collect_set(video_name)fromtvgroupbyusername
例子:
方法一:利用str_to_map函数
selectname ,info['语文']asChinese ,info['数学']asMath ,info['英语']asEnglish from(selectname,str_to_map(concat_ws(',',collect_set(concat_ws(':',subject,cast(scoreasstring)))))asinfo fromtest groupbyname )a
方法二:利用casewhen函数
selectname ,max(casewhensubject='语文'thenscoreelse0end)asChinese ,max(casewhensubject='数学'thenscoreelse0end)asMath ,max(casewhensubject='英语'thenscoreelse0end)asEnglish fromtest groupbyname2、HIVE多列转多行
将多列数据转换成瘦长的格式
select*fromtest
遍历数组中的每一列:
selectcol1,col2,name fromtest lateralviewexplode(col3)col3asname;
行转列:explode
将输入的一行数组或者map转换成列输出
语法:explode(array(ormap))
SELECTexplode(myCol)ASmyNewColFROMmyTable;
多行转换:lateralview
lateralview用于和split,explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
hive>selects.x,spfromtest.duals lateralviewexplode(split(concat_ws(',','1','2','3','4','5','6','7','8','9'), ','))tassp; xsp a1 b2 a3
from后面是表名,在表名后面加lateralviewexplode(行转列sql),还必须要起一个别名,我这个字段的别名为sp。然后再看看select后面的s.*,就是原表的字段,我这里面只有一个字段,且为x
例子:
selecttop100SN,TestProject,FreValuefromSFC1216J.dbo.T_AnalysisData
altertabledw.acoustics.2050_mea_f_t_analysisdataaddifnotexistspartition(date='{DATE}',hour='{HOUR}'); insertoverwritetabledw.acoustics.2050_mea_f_t_analysisdatapartition(date='{DATE}',hour='{HOUR}') selectid, test_id, sn, productnumber, model, processid, routeid, testproject, frevalue, frevalue_new, casewhentestproject='F0'then'0' elsesplit(frevalue_new,'_')[0]endasfre_option, casewhentestproject='F0'thensplit(frevalue_new,'_')[0] elsesplit(frevalue_new,'_')[1]endasfre_value, ispass, servertime fromods.acoustics.sfc_2050_sfc1216j.2050_t_analysisdata lateralviewexplode(split(frevalue,';'))tmpTableasfrevalue_new wheredate='{DATE}'andhour='{HOUR}'andServerTime>='2019-11-16'
例子:
selecta.date ,b.label ,b.value from(select* fromdaily_report )a LATERALVIEWexplode(map( 'UV',uv ,'新增UV',newuv ,'视频存量',video ,'新增视频',newvideo ,'播放量',vv ,'会员数',vip_num ,'新增会员数',new_vip_num ))baslabel,value
作者:zhengzaifeidelushang