hive操作

2023-09-15 14:34:50

Hive

启动类

功能说明命令
启动hiveserver2服务bin/hiveserver2
启动beelinebin/beeline
连接hiveserver2beeline> !connect jdbc:hive2://hadoop102:10000
metastroe服务bin/hive --service metastore

hive 启动元数据服务(metastore和hiveserver2)和优雅关闭脚本

启动: hive.sh start
关闭: hive.sh stop
重启: hive.sh restart
状态: hive.sh status

脚本如下

#!/bin/bash
HIVE_LOG_DIR=$HIVE_HOME/logs

mkdir -p $HIVE_LOG_DIR

#检查进程是否运行正常,参数1为进程名,参数2为进程端口
function check_process()
{
    pid=$(ps -ef 2>/dev/null | grep -v grep | grep -i $1 | awk '{print $2}')
    ppid=$(netstat -nltp 2>/dev/null | grep $2 | awk '{print $7}' | cut -d '/' -f 1)
    echo $pid
    [[ "$pid" =~ "$ppid" ]] && [ "$ppid" ] && return 0 || return 1
}

function hive_start()
{
    metapid=$(check_process HiveMetastore 9083)
    cmd="nohup hive --service metastore >$HIVE_LOG_DIR/metastore.log 2>&1 &"
    cmd=$cmd" sleep4; hdfs dfsadmin -safemode wait >/dev/null 2>&1"
    [ -z "$metapid" ] && eval $cmd || echo "Metastroe服务已启动"
    server2pid=$(check_process HiveServer2 10000)
    cmd="nohup hive --service hiveserver2 >$HIVE_LOG_DIR/hiveServer2.log 2>&1 &"
    [ -z "$server2pid" ] && eval $cmd || echo "HiveServer2服务已启动"
}

function hive_stop()
{
    metapid=$(check_process HiveMetastore 9083)
    [ "$metapid" ] && kill $metapid || echo "Metastore服务未启动"
    server2pid=$(check_process HiveServer2 10000)
    [ "$server2pid" ] && kill $server2pid || echo "HiveServer2服务未启动"
}

case $1 in
"start")
    hive_start
    ;;
"stop")
    hive_stop
    ;;
"restart")
    hive_stop
    sleep 2
    hive_start
    ;;
"status")
    check_process HiveMetastore 9083 >/dev/null && echo "Metastore服务运行正常" || echo "Metastore服务运行异常"
    check_process HiveServer2 10000 >/dev/null && echo "HiveServer2服务运行正常" || echo "HiveServer2服务运行异常"
    ;;
*)
    echo Invalid Args!
    echo 'Usage: '$(basename $0)' start|stop|restart|status'
    ;;
esac

常用交互命令

功能说明命令
不进入hive的交互窗口执行sqlbin/hive -e “sql语句”
执行脚本中sql语句bin/hive -f hive.sql
退出hive窗口exit 或 quit
命令窗口中查看hdfs文件系统dfs -ls /
命令窗口中查看hdfs文件系统! ls /data/h

SQL类(特殊的)

说明语句
查看hive中的所有数据库show databases
用default数据库use default
查询表结构desc table_name
查看数据库show databases
重命名表名alter table table1 rename to table2
修改表中字段alter table table_name change name user_name String
修改字段类型alter table table_name change salary salary Double
创建外部表create external table …
查询外部表信息desc formatted outsidetable
创建视图create view view_name as select * from table_name …
添加数据load data local inpath ‘xxx’ overwrite into table table_name partition(day=‘2021-12-01’)

内置函数

(1) NVL

给值为NULL的数据赋值,它的格式是NVL( value,default_value)。它的功能是如果value为NULL,则NVL函数返回default_value的值,否则返回value的值,如果两个参数都为NULL ,则返回NULL

select nvl(column, 0) from xxx;

(2)行转列

函数描述
CONCAT(string A/col, string B/col…)返回输入字符串连接后的结果,支持任意个输入字符串
CONCAT_WS(separator, str1, str2,…)第一个参数参数间的分隔符,如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接的字符串之间。
COLLECT_SET(col)将某字段的值进行去重汇总,产生array类型字段
COLLECT_LIST(col)函数只接受基本数据类型,它的主要作用是将某字段的值进行不去重汇总,产生array类型字段。

(3)列转行(一列转多行)

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

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

LATERAL VIEW

用法:

LATERAL VIEW udtf(expression) tableAlias AS columnAlias

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

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

准备数据源测试

moviecategory
《功勋》记录,剧情
《战狼2》战争,动作,灾难

SQL

SELECT movie,category_name 
FROM movie_info 
lateral VIEW
explode(split(category,",")) movie_info_tmp  AS category_name ;

测试结果

《功勋》      记录
《功勋》      剧情
《战狼2》     战争
《战狼2》     动作
《战狼2》     灾难

窗口函数

(1)OVER()

定分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变而变化。

(2)CURRENT ROW(当前行)

n PRECEDING:往前n行数据

n FOLLOWING:往后n行数据

(3)UNBOUNDED(无边界)

UNBOUNDED PRECEDING 前无边界,表示从前面的起点

UNBOUNDED FOLLOWING后无边界,表示到后面的终点

SQL案例:由起点到当前行的聚合

select 
    sum(money) over(partition by user_id order by pay_time rows between UNBOUNDED PRECEDING and current row) 
from or_order;

SQL案例:当前行和前面一行做聚合

select 
    sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING and current row) 
from or_order;

SQL案例:当前行和前面一行和后一行做聚合

select 
    sum(money) over(partition by user_id order by pay_time rows between 1 PRECEDING AND 1 FOLLOWING )
from or_order;

SQL案例:当前行及后面所有行

select 
    sum(money) over(partition by user_id order by pay_time rows between current row and UNBOUNDED FOLLOWING  )
from or_order;

(4)LAG(col,n,default_val)

往前第n行数据,没有的话default_val

(5)LEAD(col,n, default_val)

往后第n行数据,没有的话default_val

SQL案例:查询用户购买明细以及上次的购买时间和下次购买时间

select 
	user_id,,pay_time,money,
	
	lag(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) prev_time,
	
	lead(pay_time,1,'1970-01-01') over(PARTITION by name order by pay_time) next_time
from or_order;

(6)FIRST_VALUE(col,true/false)

当前窗口下的第一个值,第二个参数为true,跳过空值。

(7)LAST_VALUE (col,true/false)

当前窗口下的最后一个值,第二个参数为true,跳过空值。

SQL案例:查询用户每个月第一次的购买时间 和 每个月的最后一次购买时间

select
	FIRST_VALUE(pay_time) 
	    over(
	        partition by user_id,month(pay_time) order by pay_time 
	        rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
	        ) first_time,
	
	LAST_VALUE(pay_time) 
	    over(partition by user_id,month(pay_time) order by pay_time rows between UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
	    ) last_time
from or_order;

(8)NTILE(n)

把有序窗口的行分发到指定数据的组中,各个组有编号,编号从1开始,对于每一行,NTILE返回此行所属的组的编号。(用于将分组数据按照顺序切分成n片,返回当前切片值)

SQL案例:查询前25%时间的订单信息

select * from (
    select User_id,pay_time,money,
    
    ntile(4) over(order by pay_time) sorted
    
    from or_order
) t
where sorted = 1;

4个By

(1)Order By

全局排序,只有一个Reducer。

(2)Sort By

分区内有序。

(3)Distrbute By

类似MR中Partition,进行分区,结合sort by使用。

(4) Cluster By

当Distribute by和Sorts by字段相同时,可以使用Cluster by方式。Cluster by除了具有Distribute by的功能外还兼具Sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

在生产环境中Order By用的比较少,容易导致OOM。

在生产环境中Sort By+ Distrbute By用的多。

排序函数

(1)RANK()

排序相同时会重复,总数不会变

1
1
3
3
5

(2)DENSE_RANK()

排序相同时会重复,总数会减少

1
1
2
2
3

(3)ROW_NUMBER()

会根据顺序计算

1
2
3
4
5

日期函数

datediff:返回结束日期减去开始日期的天数

datediff(string enddate, string startdate) 

select datediff('2021-11-20','2021-11-22') 

date_add:返回开始日期startdate增加days天后的日期

date_add(string startdate, int days) 

select date_add('2021-11-20',3) 

date_sub:返回开始日期startdate减少days天后的日期

date_sub (string startdate, int days) 

select date_sub('2021-11-22',3)
更多推荐

利用 SOAR 加快事件响应并加强网络安全

随着攻击面的扩大和攻击变得越来越复杂,与网络攻击者的斗争重担落在了安全运营中心(SOC)身上。SOC可以通过利用安全编排、自动化和响应(SOAR)平台来加强组织的安全态势。这一系列兼容的以安全为中心的软件可加快事件调查和响应速度。SOAR平台提高了对所有安全数据的可见性,简化了IT流程,自动执行了与安全相关的手动任务,

[EI复现】基于主从博弈的新型城镇配电系统产消者竞价策略(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。⛳️座右铭:行百里者,半于九十。📋📋📋本文目录如下:🎁🎁🎁目录💥1概述📚2运行结果🎉3参考文献🌈4Matlab代码实现💥1概述新型城镇的发展需要实现能源结构清洁化和能源利用高效

{案例分析}**市 SA-接通率CCE参数优化报告

【问题描述】SA-无线接通率主要包含了SA-RRC连接建立成功率,SA-NG接口UE相关逻辑信令连接建立成功率和SA-QosFlow建立成功率;现网接通率99.27%,【问题分析】接通率主要问题在于QosFlow建立成功率相对较差,RRC建立成功率基本处于99.6%以上,NG接通率接近百分之百;【问题根因】针对于Qos

Jtti:在centos7中怎么使用yum如何删除php

要在CentOS7中使用YUM删除PHP,请执行以下步骤:打开终端:可以通过SSH远程连接到您的CentOS服务器,或者在本地访问终端。以超级用户(root)身份登录:如果不是root用户,可以使用以下命令切换到超级用户:sudosu然后输入管理员密码以获得root权限。删除PHP:您可以使用YUM删除PHP及其相关包

pytest进阶之conftest.py

前言前面几篇随笔基本上已经了解了pytest命令使用,收集用例,finxture使用及作用范围,今天简单介绍一下conftest.py文件的作用和实际项目中如是使用此文件!实例场景首先们思考这样一个问题:如果我们在编写测试用的时候,每一个测试文件里面的用例都需要先登录后才能完成后面的操作,那么们该如何实现呢?这就需要我

Python入门自学进阶-Web框架——42、Web框架了解-bottle、flask

WEB框架的三大组件:路由系统、控制器(含模板渲染)、数据库操作微型框架:依赖第三方写的socket,WSGI,本身功能少安装:pipinstallbottlepipinstallflask安装flask,同时安装了MarkupSafe、Werkzeug、Jinja2、itsdangerous。Werkzeug是Pyt

【Linux】生产者消费者模型

文章目录一、生产者消费者模型1.生产者消费者模型的概念2.生产者消费者之间的关系3.生产者和消费者的特点二、基于BlockingQueue的生产者消费者模型1.单生产单消费随机数任务计算器任务Task2.多生产多消费3.为什么生产者消费者模型高效三、基于环形队列的生产消费模型1.POSIX信号量2.基于环形队列的生产消

java版工程管理系统Spring Cloud+Spring Boot+Mybatis实现工程管理系统源码

工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理工程项目各模块及其功能点清单一、系统管理1、数据字典:实现对数据字典标签的增删改查操作2、编码管理:实现对系统编码的增删改查操作3、用户管理:管理和查看用户角

科技改变生活,吉力宝打造智能时代的智能科技鞋新风向

早在10年前,智能运动鞋概念被提起,自德国阿迪达斯公司率先将电脑芯片植入运动鞋以后,智能鞋的研发便开始成为世界市场的潮流。2016年年底,美国耐克公司推出了一款能够自动系上鞋带的运动鞋。科技改变生活,智能时代给人们的生活带来了诸多便利。不可否认,智能科技鞋在不断完善其功能的同时,与手机等智能设备的相连也逐渐实现了它与人

【LeetCode热题100】--15.三数之和

15.三数之和注意:最后答案中不能包含重复的三元组使用排序+双指针可以使用三重循环枚举三元组,但是需要哈希表进行去重操作,得到不包含重复三元组的最终答案,消耗量大量的时间和空间对于不重复的本质,保持三重循环的大框架不变,只需要保证:第二重循环枚举到的元素不小于当前第一重循环枚举到的元素第三重循环枚举到的元素不小于当前第

ESD监控报警器的功能特点以及应用领域

静电监控报警器是一种利用静电原理进行监测和报警的设备,其主要功能特点包括:1、高灵敏度:静电监控报警器能够检测到极微小的静电电荷,具有较高的灵敏度。2、高可靠性:静电监控报警器采用高品质的材料和先进的制造工艺,具有良好的可靠性和稳定性。3、多种报警方式:静电监控报警器可以通过声音、光信号、短信等多种方式进行报警,方便用

热文推荐