hive中的行列轉(zhuǎn)換包含單行、多行、單列、多列,所以一共有四種組和轉(zhuǎn)換結(jié)果。
一、多行轉(zhuǎn)多列
原始數(shù)據(jù)表
目標(biāo)結(jié)果表
分析:目標(biāo)表中的a和b是用分組形成,所以groupby字段選用原始表中col1,c、d、e是原始表中的行值,在目標(biāo)表中成了列名,目標(biāo)表中可以采用as做列名自定義,當(dāng)原始表中的某一字段值等于某一特定值時,人為定義為結(jié)果表中的列名。
SQL實現(xiàn)
select
col1 as col1,
max(case col2 when 'c' then col3 else 0 end) as c,//當(dāng)原始表中col2的字段為C時,取col3中的值,否則取0,然后取最大值,前提是原始表中沒有比0更小的數(shù),如果原始表中有比自定義的0值更小的數(shù),else不能采用0,else的值要為原始表中最小數(shù)或比最小數(shù)還小。
max(case col2 when 'd' then col3 else 0 end) as d,
max(case col2 when 'e' then col3 else 0 end) as e
from
row2col1
group by
col1;
總結(jié):多行轉(zhuǎn)多列主要是條件函數(shù),再取最大值,再用as自定義為新列名
二、單行轉(zhuǎn)多列
原始數(shù)據(jù)表
目標(biāo)數(shù)據(jù)表
**
分析:結(jié)果表是將原始表按照col1和col2進行分組統(tǒng)計,將原始表中具有相同col2的col3值拼接到目標(biāo)表col3的字段當(dāng)中,所以要采用hive中的拼接函數(shù),但是拼接函數(shù)只使用于字符串,所以要將目標(biāo)表中的col3的值轉(zhuǎn)換為字符串,同時指定拼接關(guān)系逗號
SQL語句
select
col1,
col2,
concat_ws(',', collect_list(cast(col3 as string))) as col3
from
row2col2
group by
col1, col2;
總結(jié):多行轉(zhuǎn)單列主要知識點就是字符串拼接函數(shù)
三、多列轉(zhuǎn)多行
原始表
目標(biāo)表
分析:union all 是在結(jié)果的行后面增加,簡單理解為:連接行記錄,類似向MySQL數(shù)據(jù)庫中增加行記錄
而left join是將兩個表的列全部放入一張表的列中,增加列記錄。
SQL實現(xiàn)
select col1, 'c' as col2, col2 as col3 from col2row1
UNION ALL
select col1, 'd' as col2, col3 as col3 from col2row1
UNION ALL
select col1, 'e' as col2, col4 as col3 from col2row1;
四、單列轉(zhuǎn)多行
原始表
目標(biāo)表
分析:一列中包含多個數(shù)據(jù)如Map或array,一般使用explode函數(shù),俗稱炸裂函數(shù),將數(shù)據(jù)集合切分出來展示
SQL實現(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-522973.html
select
col1,
col2,
lv.col3 as col3
from
col2row2
lateral view
explode(split(col3, ',')) lv as col3;
結(jié)果文章來源地址http://www.zghlxwxcb.cn/news/detail-522973.html
到了這里,關(guān)于Hive多行轉(zhuǎn)多列,多列轉(zhuǎn)多行的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!