zoukankan      html  css  js  c++  java
  • Hive(八)【行转列、列转行】

    一.行转列

    相关函数

    concat

    CONCAT(string A/col, string B/col…):对字符串按次序进行拼接

    返回类

    concat_ws

    concat_ws(string SEP, string A, string B...):与concat()类似,但使用指定的分隔符喜进行分隔

    concat_ws(string SEP, array< string>):拼接Array中的元素并用指定分隔符进行分隔

    collect_set

    COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。

    collect_list

    COLLECT_LIST(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。

    需求

    将原始表转换为指定的格式,把星座和血型一样的人归类到一起

    需求分析

    思路:先将两个字段聚合,然后分组处理

    数据准备

    原始数据:constellation_blood.txt

    name	constellation	blood_type
    孙悟空	白羊座	A
    大海	射手座	A
    宋宋	白羊座	B
    猪八戒	白羊座	A
    凤姐	射手座	A
    苍老师	白羊座	B
    

    创建表

    create table constellation_blood(
       name string,
       constellation string,
       blood_type string
    )
    row format delimited fields terminated by '	';
    

    向表中导入数据

    load data local inpath '/opt/module/testdata/function_test/constellation_blood.txt' into table constellation_blood;
    

    验证表数据

    select * from constellation_blood;
    

    写SQL

    第一步:将星座(constellation)和血型(blood_type)用逗号拼接,转为以下格式

    	select 
    		concat_ws(',',constellation,blood_type) con_blo,
    		name
    	FROM constellation_blood;
    

    第二步:在第一步的基础上根据星座,血型(con_blo)进行分组,通过collect_list或者collect_set将同组多行数据根据name字段聚合成一个数组(array< string>),再通过concat_ws对 数组进行拆分拼接;

    select 
    	t1.con_blo,
    	concat_ws('|',collect_list(t1.name))
    FROM 
    (
    	select 
    		concat_ws(',',constellation,blood_type) con_blo,
    		name
    	FROM constellation_blood
    )t1
    group by t1.con_blo;
    

    二.列转行

    相关函数

    split

    Split(str, separator):将字符串按照后面的分隔符切割,转换成字符array。

    explode

    EXPLODE(col):将hive一列中复杂的array或者map结构拆分成多行。

    lateral view

    用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias

    解释:lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。

    lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateral view再把结果组合,产生一个支持别名表的虚拟表。

    需求

    原始数据

    movie category
    《疑犯追踪》 悬疑,动作,科幻,剧情
    《Lie to me》 悬疑,警匪,动作,心理,剧情
    《战狼2》 战争,动作,灾难

    需求:将电影分类的数组展开,要求结果如下

    movie          category 
    《疑犯追踪》      悬疑
    《疑犯追踪》      动作
    《疑犯追踪》      科幻
    《疑犯追踪》      剧情
    《Lie to me》   悬疑
    《Lie to me》   警匪
    《Lie to me》   动作
    《Lie to me》   心理
    《Lie to me》   剧情
    《战狼2》        战争
    《战狼2》        动作
    《战狼2》        灾难
    

    需求分析

    使用split,explode,lateral view组合使用

    数据准备

    原始数据:movie_info.txt

    《疑犯追踪》	悬疑,动作,科幻,剧情
    《Lie to me》	悬疑,警匪,动作,心理,剧情
    《战狼2》	战争,动作,灾难
    

    创建表

    create table movie_info(
       movie string,
       category string
    )
    row format delimited fields terminated by '	';
    

    向表中加载数据

    load data local inpath '/opt/module/testdata/function_test/movie_info.txt' into table movie_info;
    

    验证表数据

    select * from movie_info;
    

    写SQL

    第一步:用split将category切分成数组,用explode函数将category数组炸开

    select 
    	explode(split(category,','))
    from movie_info;
    

    第二步:用lateral view函数对原表的movie字段对炸开表进行侧写

    select
    	movie,
    	category_name
    from movie_info
    lateral view 
    explode(split(category,',')) movie_tmp AS category_name;
    

  • 相关阅读:
    转:git上传本地项目到github
    转:git常用操作
    idea常用快捷键
    转:spring中InitailizingBean接口的简单理解
    resulting in duplicate entry '1' for key 'primary'
    Uncaught SyntaxError: Unexpected identifier
    This application has no explicit mapping for /error, so you are seeing this as a fallback.
    启动web项目报错:The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.
    解决 "Could not autowire. No beans of 'SationMapper' type found" 的问题
    javascript 判断系统设备
  • 原文地址:https://www.cnblogs.com/wh984763176/p/13211299.html
Copyright © 2011-2022 走看看