国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Hive的行列轉(zhuǎn)換(行轉(zhuǎn)多列、多列轉(zhuǎn)行、行轉(zhuǎn)單列、單列轉(zhuǎn)行)

這篇具有很好參考價(jià)值的文章主要介紹了Hive的行列轉(zhuǎn)換(行轉(zhuǎn)多列、多列轉(zhuǎn)行、行轉(zhuǎn)單列、單列轉(zhuǎn)行)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

在實(shí)際使用Hive的過程中,常常會(huì)涉及到行列轉(zhuǎn)換,細(xì)分的話,有下面4種類型的行列轉(zhuǎn)換,分別是:

  1. 行轉(zhuǎn)多列
  2. 多列轉(zhuǎn)行
  3. 行轉(zhuǎn)單列
  4. 單列轉(zhuǎn)行

下面我們通過樣例介紹每種行列轉(zhuǎn)換的實(shí)現(xiàn)方法。

樣例表
班級(jí)成績(jī)表:

姓名(name) 學(xué)科(subject) 成績(jī)(score)

A	語文	70
A	數(shù)學(xué)	90
A	英語	80
B	數(shù)學(xué)	95
B	英語	85
B	語文	75

行列轉(zhuǎn)換思路分析及實(shí)現(xiàn)
行轉(zhuǎn)多列
如果需要將上面的樣例表轉(zhuǎn)換為
“姓名 | 語文成績(jī) | 數(shù)學(xué)成績(jī) | 英語成績(jī)”
這樣的格式,那么這就需要用到行轉(zhuǎn)多列。

思路:
涉及到行轉(zhuǎn)成列,肯定是會(huì)按照某一列或者某幾列的值進(jìn)行分組來壓縮行數(shù),所以會(huì)用到group by。
分組之后需要用到聚合函數(shù),由于多列中的每列只關(guān)心自己對(duì)應(yīng)的數(shù)據(jù),所以要使用case語句進(jìn)行選擇,至于聚合函數(shù),只要數(shù)據(jù)能保證唯一性,max、min、avg(數(shù)值類型)等都可以

樣例SQL:

select name,
max(case when subject = '數(shù)學(xué)' then score else null end) math,
max(case when subject='英語' then score else null end) english,
max(case when subject='語文' then score else null end) chinese
from t1
group by name;

多列轉(zhuǎn)行
將上面行轉(zhuǎn)多列的結(jié)果再轉(zhuǎn)回成原始表結(jié)構(gòu)的過程,就是多列轉(zhuǎn)行

思路
列轉(zhuǎn)行,會(huì)涉及到行數(shù)的增加,所以會(huì)用到UDTF,而UDTF只是針對(duì)某一列的,要把這列擴(kuò)展后生成的多行數(shù)據(jù)和源表中的各列拼接在一起,需要用到lateral view語法;
需要將多列里各列的列名(業(yè)務(wù)含義),在新數(shù)據(jù)中當(dāng)做一個(gè)標(biāo)識(shí)列,而與lateral view聯(lián)合使用的explode函數(shù)是支持Map類型的,所以要先將原表里的多列變換成Map類型的一列,然后再用lateral view拆開。

樣例SQL:

select name,subject,score from
(
	select name,map('數(shù)學(xué)',math,'英語',english,'語文',chinese) scores
	from t2
) tt1 
lateral view explode(scores) tt2 as subject,score;

行轉(zhuǎn)單列
將原始表轉(zhuǎn)換為
“姓名 | 所有科目成績(jī)集合 ”
則涉及到行轉(zhuǎn)單列

思路
和行轉(zhuǎn)多列一樣,行數(shù)會(huì)減少,所以需要用到group by,然后轉(zhuǎn)成的是單列,所以需要用到collect_list或者collect_set聚合函數(shù),如果字段類型想要是有分隔符隔開的字符串,再套上一層concat_ws;
上面的方案得出的array或者字符串是亂序的,如果想要進(jìn)行排序,可以使用sort_array函數(shù)。但sort_array只能按字段類型的升序排列(數(shù)值字段自然序,字符串字段字典序);
如果想要自己指定排序規(guī)則,或者排序的不是單列里的這個(gè)字段(比如班級(jí)考試成績(jī)表,所有分?jǐn)?shù)字段里需要根據(jù)學(xué)科進(jìn)行排序,而不是分?jǐn)?shù)高低),則需要使用collect_list加上over子句來實(shí)現(xiàn)。

樣例SQL:
1、成績(jī)不排序

select name,concat_ws(',',collect_list(score))
from t1
group by name;

2、按分?jǐn)?shù)高低排序

select name,concat_ws(',',sort_array(collect_list(score)))
from t1
group by name;

3、按學(xué)科進(jìn)行排序

select name,concat_ws(',',max(a)) from 
(
	select name,
		collect_list(score) over(partition by name order by subject 
			rows between unbounded preceding and unbounded following) a 
	from t1
) tt1 group by name;

4、按指定的學(xué)科順序排序

select name,concat_ws(',',max(a)) scores from 
(
	select name,
		collect_list(score) over(partition by name 
			order by case when subject='語文' then 1 
						  when subject='數(shù)學(xué)' then 2 
						  when subject='英語' then 3 end 
			rows between unbounded preceding and unbounded following) a 
	from t1
) tt1 group by name;

單列轉(zhuǎn)行
將上面的結(jié)果轉(zhuǎn)成原始表結(jié)構(gòu),就是單列轉(zhuǎn)行

思路
和多列轉(zhuǎn)行一樣,使用lateral view加explode來轉(zhuǎn)換。但這種方式轉(zhuǎn)換出來會(huì)丟失掉科目字段信息;
如果需要加上科目信息,則需要按照單列里面的順序的業(yè)務(wù)含義,先將單列轉(zhuǎn)成Map類型,將科目加到數(shù)據(jù)里,然后再使用lateral view轉(zhuǎn)換。

樣例SQL:
1、無科目字段

select name,score from
(
	select name,split(scores,',') s from t3
) tt1 
lateral view explode(s) tt2 as score;

2、有科目字段文章來源地址http://www.zghlxwxcb.cn/news/detail-558309.html

select name,subject,score from
(
	select name,map('語文',s[0],'數(shù)學(xué)',s[1],'英語',s[2]) ss from 
	(
		select name,split(scores,',') s from t3
	) tt1
) ttt1
lateral view explode(ss) ttt2 as subject,score;

到了這里,關(guān)于Hive的行列轉(zhuǎn)換(行轉(zhuǎn)多列、多列轉(zhuǎn)行、行轉(zhuǎn)單列、單列轉(zhuǎn)行)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Hive多行轉(zhuǎn)多列,多列轉(zhuǎn)多行

    Hive多行轉(zhuǎn)多列,多列轉(zhuǎn)多行

    原始數(shù)據(jù)表 目標(biāo)結(jié)果表 分析:目標(biāo)表中的a和b是用分組形成,所以groupby字段選用原始表中col1,c、d、e是原始表中的行值,在目標(biāo)表中成了列名,目標(biāo)表中可以采用as做列名自定義,當(dāng)原始表中的某一字段值等于某一特定值時(shí),人為定義為結(jié)果表中的列名。 SQL實(shí)現(xiàn) 總結(jié):多行

    2024年02月12日
    瀏覽(30)
  • Hive數(shù)據(jù)倉庫行轉(zhuǎn)列

    查了很多資料發(fā)現(xiàn)網(wǎng)上很多文章都是轉(zhuǎn)發(fā)和抄襲,有些問題。這里分享一個(gè)自己項(xiàng)目中使用的行轉(zhuǎn)列例子,供大家參考。代碼如下: 如果是在SparkSQL或Presto平臺(tái),或者阿里云的MaxCompute平臺(tái),還可使用如下方式:

    2024年02月21日
    瀏覽(29)
  • 【Hive-SQL】Hive Select 選擇語句排除一列或多列

    查看 除了sample_date 以外的所有字段信息 查看 除了sample_date 和 msgtype 以外的所有字段信息 上面的 set hive.support.quoted.identifiers=none; 可以替換操作: 在 \\\'hive-site.xml\\\' 中添加以下配置: hive.support.quoted.identifiers=none

    2024年02月10日
    瀏覽(21)
  • 【hive】行轉(zhuǎn)列—explode()/posexplode()/lateral view 函數(shù)使用場(chǎng)景

    功能: 用于和UDTF函數(shù)(explode,split)結(jié)合使用,把某一行數(shù)據(jù)拆分成多行數(shù)據(jù),再將多行結(jié)果組合成一個(gè)支持別名的虛擬表。 主要解決select使用UDTF做查詢的過程中查詢只能包含單個(gè)UDTF,不能包含其它字段以及多個(gè)UDTF的情況。 語法:LATERAL VIEW udtf(expression) tableAlias AS columnAlia

    2024年04月09日
    瀏覽(22)
  • HIVE SQL通過Lateral View + explode實(shí)現(xiàn)列轉(zhuǎn)行

    原表: a b Andy 碟中諜,諜影重重,007 MOMO 小鞋子,朋友啊你的家在哪里 David ‘’ Lily NULL 實(shí)現(xiàn)效果 a b Andy 碟中諜 Andy 諜影重重 Andy 007 MOMO 小鞋子 MOMO 朋友啊你的家在哪里 David ‘’ 實(shí)現(xiàn)代碼: 注: explode函數(shù):處理map結(jié)構(gòu)的字段,將數(shù)組轉(zhuǎn)換成多行,所以此處使用了split函數(shù)將

    2024年02月12日
    瀏覽(39)
  • 【SQL相關(guān)】Hive行列字符串的合并與拆分

    目錄 一、行方向 1. 行方向的合并 1.1 concat 函數(shù) 1.2 concat_ws 函數(shù) 2. 行方向的拆分 二、列方向 1. 列方向的合并 1.1 group_concat 函數(shù) 1.2 collect_list 函數(shù) 1.3 collect_set 函數(shù) 2. 列方向的拆分 2.1 explode 函數(shù) 2.2 lateral view 1. 行方向的合并 將同一行某幾列的數(shù)據(jù)以分隔符分隔,合并到同一列

    2024年04月14日
    瀏覽(54)
  • Hive字符串?dāng)?shù)組json類型取某字段再列轉(zhuǎn)行

    acct content 1232313 [{\\\"name\\\":\\\"張三\\\",\\\"code\\\":\\\"上海浦東新區(qū)89492jfkdajrn福建的卡\\\"...},{\\\"name\\\":\\\"狂徒\\\",\\\"code\\\":\\\"select * from table where aa=1rn and a=12\\\"...},{...}] ... ... ?上述數(shù)據(jù)表名code_content,把json中code內(nèi)容全都取出來拼接成一行數(shù)據(jù),最終效果: acct new_content 1232313 上海浦東新區(qū)89492jfkdajrn福建的

    2024年02月11日
    瀏覽(23)
  • Hive SQL 中ARRAY或MAP類型數(shù)據(jù)處理:lateral view explode()/posexplode()——行轉(zhuǎn)列函數(shù)

    Hive SQL 中ARRAY或MAP類型數(shù)據(jù)處理:lateral view explode()/posexplode()——行轉(zhuǎn)列函數(shù)

    前言:在對(duì)表數(shù)據(jù)進(jìn)行批量處理過程中,常常碰上某個(gè)字段是一個(gè)array或者map形式的字段,一列數(shù)據(jù)的該字段信息同時(shí)存在多個(gè)值,當(dāng)我們需要取出該數(shù)組中的每一個(gè)值實(shí)現(xiàn)一一對(duì)應(yīng)關(guān)系的時(shí)候,可以考慮使用lateral view explode()/posexplode() 進(jìn)行處理。 一、提要:explode()本身是

    2024年02月04日
    瀏覽(28)
  • 把多列的迭代次數(shù)問題化簡(jiǎn)為單列問題

    前已有實(shí)驗(yàn)表明,當(dāng)訓(xùn)練集只有一列的時(shí)候,收斂迭代次數(shù)與訓(xùn)練集分布的標(biāo)準(zhǔn)差成反比。分布越均勻迭代次數(shù)越大。如果可以把多列問題化簡(jiǎn)為單列問題,比較迭代次數(shù)的大小順序就會(huì)變得很簡(jiǎn)單。 ( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 做一個(gè)網(wǎng)絡(luò)來分類A和B,網(wǎng)絡(luò)輸入只有3個(gè)節(jié)點(diǎn)

    2023年04月11日
    瀏覽(18)
  • Oracle——行轉(zhuǎn)列與列轉(zhuǎn)行

    Oracle——行轉(zhuǎn)列與列轉(zhuǎn)行

    把某一個(gè)字段的值作為唯一值,然后另外一個(gè)字段的 行值轉(zhuǎn)換成它的列值 。 轉(zhuǎn)換過程大致如下所示: 通常情況下,采取 group by 唯一字段 進(jìn)行分組,然后依據(jù)不同的列進(jìn)行判斷輸出就能轉(zhuǎn)換。 建表語句和增加測(cè)試數(shù)據(jù)sql如下所示: 執(zhí)行完畢后,數(shù)據(jù)庫中當(dāng)前的數(shù)據(jù)結(jié)構(gòu)如

    2024年02月15日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包