首页 > 其他分享 >hive 行列转换案例

hive 行列转换案例

时间:2023-04-21 12:03:53浏览次数:32  
标签:name 行列 hive 案例 user address zhangsan id select


 

 

 

0  stu表数据:

 

stu:
id             name
hello,you zm2008
hello,me zm2015

 

 

1 实现单词计数:     (列转行)   ---> split切分+explode(炸开)

 

1.0 数据拆分成数组

select split(id,',') from  stu;    得到数组
[hello,you]
[hello,me]

 

1.1 继续将数组拆分(hive explode函数会将数组继续拆分成单个字符)

select explode(split(id,','))  from stu;   窗体函数
hello
you
hello
me

 

1.2 分组统计:

select t1.c1, count(1) from (select explode(split(id,',')) as c1  from stu)  t1 group by t1.c1;
hello 2
you 1
me 1

 

上述语句中, t1表是1.1的结果

 

 

2  行转列:  明确以哪个字段分组,分组后将列转成行使用  

--->  多列间隔符concat_ws+封装多列组合体 collect_set+ 分组字段 grtoup by

公式: concat_ws(",",collect_set(要转成行的列))  group by 分组列

 

2.0 表数据

 

列转换行:

user
id name
1 zhangsan
2 lisi
3 wangwuaddress
name     addr
zhangsan beijing
zhangsan shanghai
lisi tianjin
wangwu nanjing

期待结果:
1 zhangsan beijing,shanghai
2 lisi tianjin
3 wangwu nanjing

 

2.1  函数介绍:

collect_set(x)   列转行函数---没有重复, 组装多列的数据的结构体
collect_list(x)   列转行函数---可以有重复,组装多列的数据的结构体
concat_ws 拼接函数, 用于多列转成同一行字段后,间隔符

 

 

2.2 操作步骤:

 

2.2.0:

select user.id, user.name, address.addr from user join address on user.name = address.name;


1 zhangsan beijing
2 zhangsan shanghai
3 lisi tianjin
4 wangwu nanjing

 

2.2.1:

select max(user.id), user.name, collect_set(address.addr) from user join address on user.name = address.name group by user.name;
2 lisi [tianjin]


3 wangwu [nanjing]
1 zhangsan [shanghai,beijing]

 

2.2.2: 以name分组,将name相同下的 addr列转变成行存储,并且分组后列为多个下下以,做间隔

select max(user.id) as id, user.name, concat_ws(",",collect_set(address.addr)) from user join address on user.name = address.name group by user.name order by id;


1 zhangsan shanghai,beijing
2 lisi tianjin
3 wangwu nanjing

 

 

2.3 多行转换一列案例2:

一、问题

hive如何将

a       b       1
a       b       2
a       b       3
c       d       4
c       d       5
c       d       6

变为:

a       b       1,2,3
c       d       4,5,6


二、数据

test.txt

a       b       1 
a       b       2 
a       b       3 
c       d       4 
c       d       5 
c       d       6

三、答案

1.建表

drop table tmp_jiangzl_test;
create table tmp_jiangzl_test
(
col1 string,
col2 string,
col3 string
)
row format delimited fields terminated by '\t'
stored as textfile;


load data local inpath '/home/jiangzl/shell/test.txt' into table tmp_jiangzl_test;

2.处理

select col1,col2,concat_ws(',',collect_set(col3)) 
from tmp_jiangzl_test  
group by col1,col2;

 

 

 

3 行转换列:  查询多个字段下 later view的使用

 



行转列中,如果查询字段是多个,不仅仅是列转行的这个字段的话,那么久要是用到 later view注意later view后要有别名



1    zhangsan    shanghai,beijing



2    lisi    tianjin



3    wangwu    nanjing



 



create table stu(id string,name string,addr string) row format delimited fields terminated by '\t'; 
  
 
  

      
  
 
  

    load data local inpath '/home/18511893257/stu' into table stu; 
  
 
  

      
  
 
  

    select id, name, addr1  from stu  lateral view explode(split(addr,','))a as addr1;



OK



1       zhangsan        shanghai



1       zhangsan        beijing



2       lisi    tianjin



3       wangwu  nanjing



 

 

 

 4 行转换列:  单表下写法

 

 

hive如何将

a       b       1
a       b       2
a       b       3
c       d       4
c       d       5
c       d       6

变为:

a       b       1,2,3
c       d       4,5,6

 

 

select col1,col2,concat_ws(',',collect_set(col3)) 
from tmp_jiangzl_test  
group by col1,col2;    ----------------》 已经验证过  OK

 

 

 

标签:name,行列,hive,案例,user,address,zhangsan,id,select
From: https://blog.51cto.com/u_16081606/6212426

相关文章

  • hive 知识总结
      hive为何要修改数据库: deby只支持一个SESSION会话,如果hive使用默认的deby,那么在linux客户端开启第二个Hive命令行的时候,会报错,而mysql是支持多会话的数据库。  hive对应的列为何不规定长度:  不确定这些字段的长度,而且最终存储在hdfs文件中(联想与txt)txt中也没法规......
  • hive出现MetaException(message:Metastore contains multiple versions (2)异常
    1、使用Spark操作Hive表时发生的报错2、错误日志23/04/1908:49:28WARNmetadata.Hive:Failedtoaccessmetastore.Thisclassshouldnotaccessedinruntime.org.apache.hadoop.hive.ql.metadata.HiveException:java.lang.RuntimeException:Unabletoinstantiateor......
  • 【视频】R语言生存分析原理与晚期肺癌患者分析案例|数据分享|附代码数据
    原文链接:http://tecdat.cn/?p=10278最近我们被客户要求撰写关于生存分析的研究报告,包括一些图形和统计输出。生存分析(也称为工程中的可靠性分析)的目标是在协变量和事件时间之间建立联系生存分析的名称源于临床研究,其中预测死亡时间,即生存,通常是主要目标。生存分析是一种回归问......
  • 08 04 jmeter 性能测试案例 分布式压力测试
       打开虚拟机打开所在位置返回上一目录复制两个虚拟机查看虚拟机ip关闭防火墙 启动主要虚拟机的tomcat 另外两个虚拟机如果  将进程删除再进找到 #号去掉false改为true #去掉数字改为好记的端口之后两个虚拟机都要打开jmeter须在bin目录......
  • Hive 修改计算引擎方法
    前置说明各位应该清楚,hive默认计算引擎是mr,当集群配置了hive-ob-spark后可以根据需要自行切换计算引擎其它计算引擎切换为mapreducesethive.execution.engine=mr;其它计算引擎切换为sparksethive.execution.engine=spark;说明:如果一个诸如shell脚本里封装了几段......
  • 指针配合数组和函数案例(冒泡排序)
    #include<iostream>usingnamespacestd;voidmaopao(int*arr,intlen){ for(inti=0;i<len-1;i++) { for(intj=0;j<len-i-1;j++) { if(arr[j]>arr[j+1]) { inttemp=arr[j]; arr[j]=arr[j+1]; arr[j+1]=temp; } } }}voidprintf(int*arr,in......
  • hive
    解压hive到/usr/local/src目录下并修改名称为hivemvapache-hive-3.1.3-binhive配置hive的环境变量#HIVE_HOMEexportHIVE_HOME=/usr/local/src/hiveexportPATH=$PATH=$HIVE_HOME/bin:$PATHsource一下重启配置hive-env.sh,添加hive,java,hadoop的环境变量进去exportHIVE......
  • hive 常用命令
       hive开启命令窗口hive--servicecli; hive--servicemetastore& 开启hivemetastore hive--servicehiveserver-p11000>/dev/null2>&1&   开启远程连接端口 hivesql文件执行方式:1>hive-ffile2hive>sourcefile  ......
  • hive日志位置
        日志记录了程序运行的过程,是一种查找问题的利器。Hive中的日志分为两种1.系统日志,记录了hive的运行情况,错误状况。2.Job日志,记录了Hive中job的执行的历史过程。系统日志存储在什么地方呢?在hive/conf/hive-log4j.properties文件中记录了Hive日志的存储情况,默认的存储......
  • hive 使用JDBC访问 和启动远程端口
      0:hiveservice开启远程访问端口: hive使用jdbc进行访问,要求我们必须开启远程可以访问的端口,其中端口11000是随机的,可以是10002或者别的端口,这设定好好java代码链接时候就要使用开启好的端口。  linuxshell下执行hive--servicehiveserver-p11000>/dev/null2>&1......