日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

Spark/Hive 行列轉(zhuǎn)換

作者:南風(fēng)知我意丿 更新時(shí)間: 2022-09-05 編程語言

Spark/hive Sql 行列轉(zhuǎn)換

  • explode
    • demo
        • explode(map)
        • lateral view explode(map)
        • explode(array)
  • lateral view
    • demo
        • lateral view explode
        • 統(tǒng)計(jì)id出現(xiàn)次數(shù)
        • lateral view parse_url_tuple
  • 列轉(zhuǎn)行
    • 單列轉(zhuǎn)多行
        • LATERAL VIEW explode
    • 多列轉(zhuǎn)多行
        • LATERAL VIEW posexplode
        • split
  • 行轉(zhuǎn)列
    • 單行轉(zhuǎn)多列
        • split
    • 多行轉(zhuǎn)多列
        • max case when

explode

在這里插入圖片描述

分類:UDTF
功能:函數(shù)可以將一個(gè)array或者map展開
1.explode(array):將array列表里的每個(gè)元素生成一行
2.explode(map):每一對元素作為一行,key為一列,value為一列

demo

  • explode(map)

//todo explode(map)

select explode(map('A',10,'B',20,'C',30)) as (key,value);

在這里插入圖片描述

  • lateral view explode(map)

select
    tf.*
from
(select 0) t
lateral view explode(map('A',10,'B',20,'C',30)) tf as key,value;

在這里插入圖片描述

  • explode(array)

//todo explode(array)
SELECT explode(split(name,"")) FROM hobbies

在這里插入圖片描述


lateral view

分類:視圖
功能:配合UDTF來使用,把某一行數(shù)據(jù)拆分成多行數(shù)據(jù)
很多的UDTF不能將結(jié)果與源表進(jìn)行關(guān)聯(lián),使用lateral view ,可以將UDTF拆分的單個(gè)字段數(shù)據(jù)與原始表數(shù)據(jù)關(guān)聯(lián)上

demo

  • lateral view explode

  • 原表
    在這里插入圖片描述

  • 轉(zhuǎn)換

SELECT name,ids
from hobbies
LATERAL VIEW explode(id_list) tmp_view AS ids;

在這里插入圖片描述

  • 統(tǒng)計(jì)id出現(xiàn)次數(shù)

SELECT ids,count(1) as ids_cnt
from hobbies
LATERAL VIEW explode(id_list) tmp_view AS ids
GROUP BY ids;

在這里插入圖片描述

  • lateral view parse_url_tuple

  • 原表
insert into urls (id, url) values
    ("1","http://facebook.com/path/p1.php?query=1"),
    ("2","http://www.baidu.com/news/index.jsp?uuid=frank"),
    ("3","http://www.jd.com/index?source=baidu");

SELECT * from urls;

在這里插入圖片描述

  • 轉(zhuǎn)換
SELECT
    a.*,
    b.host,
    b.path
FROM urls a
LATERAL VIEW parse_url_tuple(url, 'HOST',"PATH") b as host,path;

在這里插入圖片描述


列轉(zhuǎn)行

  • 原表
SELECT
    name,
    concat_ws(',',collect_set(course)) AS course,
    concat_ws(',',collect_set(cast(score AS string))) AS score
FROM posexplode
GROUP BY name;

在這里插入圖片描述

單列轉(zhuǎn)多行

  • LATERAL VIEW explode

// todo 單列轉(zhuǎn)多行
WITH t1 AS (
    SELECT
        name,
        concat_ws(',',collect_set(course)) AS course,
        concat_ws(',',collect_set(cast(score AS string))) AS score
    FROM posexplode
    GROUP BY name
 )
SELECT
    name,pose_course,SCORE
FROM t1
LATERAL VIEW explode(split(t1.COURSE,',')) tmp_view AS pose_course

在這里插入圖片描述

多列轉(zhuǎn)多行

  • LATERAL VIEW posexplode

// todo 多列轉(zhuǎn)多行
WITH t1 AS (
    SELECT
        name,
        concat_ws(',',collect_set(course)) AS course,
        concat_ws(',',collect_set(cast(score AS string))) AS score
    FROM posexplode
    GROUP BY name
 )
SELECT
    name,pos_course,a,pos_score,b
FROM t1
LATERAL VIEW posexplode(split(t1.COURSE,',')) cr AS a, pos_course
LATERAL VIEW posexplode(split(t1.SCORE,',')) cr AS b, pos_score
WHERE a=b

在這里插入圖片描述

  • split

在這里插入圖片描述

select
    concat_ws(',',
        concat(c1,':c:',c2),
        concat(c1,':d:',c3),
        concat(c1,':e:',c4)
    ) as value
from  col2row;

在這里插入圖片描述

SELECT
     split(value_list,":")[0] c1,
     split(value_list,":")[1] c2,
     split(value_list,":")[2] c3
FROM (
    select
        concat_ws(',',
            concat(c1,':c:',c2),
            concat(c1,':d:',c3),
            concat(c1,':e:',c4)
        ) as value
    from  col2row
)t1
LATERAL VIEW explode(split(t1.VALUE,",")) tmp_view AS value_list;

在這里插入圖片描述

行轉(zhuǎn)列

單行轉(zhuǎn)多列

  • split

在這里插入圖片描述

SELECT
   split(c1,',')[0] as id,
   split(c1,',')[1] as name
FROM test

在這里插入圖片描述

多行轉(zhuǎn)多列

  • max case when

在這里插入圖片描述

SELECT
    c1,
 CASE WHEN c2='c' THEN c3 ELSE 0 END,
 CASE WHEN c2='d' THEN c3 ELSE 0 END,
 CASE WHEN c2='e' THEN c3 ELSE 0 END
from row2col

在這里插入圖片描述

SELECT
    c1,
 max(CASE WHEN c2='c' THEN c3 ELSE 0 END) c,
 max(CASE WHEN c2='d' THEN c3 ELSE 0 END) d,
 max(CASE WHEN c2='e' THEN c3 ELSE 0 END) e
from row2col
GROUP BY c1;

在這里插入圖片描述

原文鏈接:https://blog.csdn.net/Lzx116/article/details/126503545

欄目分類
最近更新