hive学习笔记(代码片段)

一加六 一加六     2023-02-02     648

关键词:

安装配置

安装hive
下载hive
解压

重命名

添加环境变量
Vi /etc/proflie

使环境变量生效
Source /etc/profile
修改配置文件
cp hive-env.sh.template hive-env.sh

Hive Metastore配置
将自带的derby数据库替换为mysql数据库
参考文章https://my.oschina.net/u/4292373/blog/3497563
登录mysql创建新用户

授权

刷新权限

新增hive-site.xml文件

记坑

hive-default.xml.template 的开头就写明了 WARNING!!!对该文件的任何更改都将被Hive忽略
其实hive-site.xml是用户定义的配置文件
hive在启动的时候会读取两个文件一个是hive-default.xml.template 还有一个就是hive-site.xml
当执行cp复制命令时 hive-site.xml 里就有了hive-default.xml.template的内容
当你继续写入关于mysql的配置保存后进行初始化hive mysql时就会报这个错误,然后hive的Metastore 服务起不来。
解决办法
在复制的hive-site.xml里保存你写的配置项,然后将其他的删掉
hive-site.xml只能写你自己的配置项,其他删掉
原文链接:https://blog.csdn.net/qq_43506520/article/details/83346463
cp hive-default.xml.template hive-site.xml
Vi hive-site.xml 在hive-site.xml文件只保存如下配置

Join全连接查询报错
运行join语句需配置如下条件
文章https://blog.csdn.net/Joseph25/article/details/103507481

Jdbc安装驱动
把连接MySQL的JDBC驱动包复制到Hive的lib目录下
(下载地址:https://dev.mysql.com/downloads/connector/j/)
(驱动包名为:mysql-connector-java-5.1.46-bin.jar)

初始化数据库
schematool -dbType mysql -initSchema

若失败
错误类型和参考如下
https://blog.csdn.net/lsr40/article/details/78026125
https://blog.csdn.net/brotherdong90/article/details/49661731/
开启metastore
本地服务
hive --service metastore
防火墙开启9083

  <property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
    <description>在dfs上的路径</description>
  </property>
  <property>
    <name>hive.metastore.uris</name>
    <value>thrift://localhost:9083</value>
    <description>Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.</description>
  </property>

远程服务
hiveserver2 start
需防火墙开启端口 10000

启动hive client
Commend命令行输入hive即可进入
启动hive

启动出现临时文件夹位置未定义问题
解决方案参考如下文章:
https://www.cnblogs.com/qxyy/articles/5247933.html

数据定义

数据库

#创建
Create database  if not exists emp;
#查看
Show databases#描述
Describe formatted emp;
#使用
Use emp;
#修改
Alter database set dbproperty;

数据表
创建普通内部表

Create table employee(eid int,ename string,egender tinyint,esalary float);

创建外部表

Create external table emp(eid int,ename string,egender tinyint,esalary float);

内部表外部表转换
alter table table_name set tablepropertiles(‘external’=’true’|false);
分隔符
列分隔符
行分隔符
集合分隔符
Map分隔符

CREATE TABLE students(name string,age int,
subject  ARRAY<String>,
score  MAP<String,float>,
address  STRUCT<houseNumber:int, 
street:STRING, city:STRING, province:STRING>
) ROW FORMAT DELIMITED 
FIELDS  TERMINATED BY "\\001"   #-- 列分隔符
COLLECTION  ITEMS TERMINATED BY "\\002" 
#--MAP STRUCT 和 ARRAY 的分隔符(数据分割符号)
MAP KEYS  TERMINATED BY "\\003"  #-- MAP 中的 key 与 value 的分隔符
LINES  TERMINATED BY "\\n"   #-- 行分隔符

分区分桶
为什么分:
使用分区技术,避免hive全表扫描,提升查询效率
如何分:
整个表的数据在存储时划分到多个子目录,从而在查询时可以指定查询条件(子目录以分区变量的值来命名)eg:year=‘2018’
分区需注意什么:
PARTIONED BY(colName dataType)
hive的分区字段使用的是表外字段。而mysql使用的是表内字段。
1、hive的分区名区分大小写
2、hive的分区本质是在表目录下面创建目录,但是该分区字段是一个伪列,不真实存在于数据中
3、一张表可以有一个或者多个分区,分区下面也可以有一个或者多个分区

#导入分区
load data local inpath '/usr/local/xxx' into table part1 partition(country='China'); #要指定分区
#二级分区
create table if not exists part2(
uid int,
uname string,
uage int
)
PARTITIONED BY (year string,month string)
row format delimited 
fields terminated by ','
;

load data local inpath '/usr/local/xxx' into table part1
partition(year='2018',month='09'); 
#增加分区
alter table part1 add partition(country='india') partition(country='korea') partition(country='America')
#加载分区数据
location '/user/hive/warehouse/xxx'#修改分区的存储路径:(hdfs的路径必须是全路径)
alter table part1 partition(country='Vietnam') set location ‘hdfs://hadoop01:9000/user/hive/warehouse/brz.db/part1/country=Vietnam’
#动态分区
#动态分区的属性:
set hive.exec.dynamic.partition=true;//(true/false)
set hive.exec.dynamic.partition.mode=strict;//(strict/nonstrict) #至少有一个静态的值
set hive.exec.dynamic.partitions=1000;//(分区最大数)
set hive.exec.max.dynamic.partitions.pernode=100
#创建动态分区表
create table if not exists dt_part1(
uid int,
uname string,
uage int
)
PARTITIONED BY (year string,month string)
row format delimited 
fields terminated by ','
;
#加载数据:(使用 insert into方式加载数据)
insert into dy_part1 partition(year,month) select * from part_tmp ;

分桶
在分区下分桶,分桶使用表内字段

语法格式
CREATE [EXTERNAL] TABLE <table_name>
(<col_name> <data_type> [, <col_name> <data_type> ...])]
[PARTITIONED BY ...]
CLUSTERED BY (<col_name>)
[SORTED BY (<col_name> [ASC|DESC] [, <col_name> [ASC|DESC]...])]
INTO <num_buckets> BUCKETS

CLUSTERED BY (<col_name>):以哪一列进行分桶 选择一列来分桶
SORTED BY (<col_name> [ASC|DESC]:对分桶内的数据进行排序
INTO <num_buckets> BUCKETS:分成几个桶

列信息更改

修改名称
Alter table emp change eid id string;

增加列

数据操作

#装载数据
Load data to table inpath ‘’
#插入数据
Insert into table emp partition(year=2021,month=10) select id,name from ept;
#导出数据
#到hdfs
Export table ept to/hom/emp’;
#Insert 导出
Insert overwrite local directory ‘path’ select * from emp;
#到本地
Hfds dfs -get localpath
#Hive shell 命令导出
Hive -e ‘select * from emp;> localpath
#导入数据
Import table emp  from path;
#HQL查询
Case when 
Select name,salary, case
Wehn salary <5000  then ‘low’
When salary >=5000 and salary <7000 then ‘middle’
Whne salary >=7000 then salary < 10000 then ‘high’
Else ‘vary high’
End as bracket from emp;

Like和rlike
使用Like运算符可以进行模糊查询,通配符"%“代表0个或多个字符,”_"代表1个字符。RLIKE子句是Hive中这个功能的一个扩展,其可以通过Java的正则表达式这个更强大的语言来指定匹配条件。
GROUP BY
GROUP BY语句通常会和聚合函数一起使用,按照一个或者多个队列结果进行分组,然后对每个组执行聚合操作
HAVING
在 SQL 中增加 HAVING 子句原因是,WHERE 关键字无法与合计函数一起使用。
Having
与where不同
(1)where是对表中数据的筛选,having是对分组统计结果的筛选
(2)Where后不能写分组函数,而having后可以使用分组函数。
(3)Having只用于group by分组统计语句。
SELECT Customer,SUM(OrderPrice) FROM Orders
GROUP BY Customer
HAVING SUM(OrderPrice)<2000
Join
内连接
内连接(INNER JOIN)中,只有进⾏连接的两个表中都存在与连接条件相匹配的数据 时,记录才会被筛选出来
SELECT a.empno,a.ename,b.dname FROM emp a JOIN dept b ON a.deptno=b.deptno;
左连接
左外连接(LEFT OUTER JOIN)中,JOIN操作符左边表中符合WHERE⼦句的所有记 录将会出现在查询结果中。右边表中如果没有符合ON后⾯连接条件的记录时,从右边表 指定选择的列的值将会是NULL。
SELECT a.empno,a.ename,b.dname FROM emp a LEFT OUTER JOIN dept b ON a.deptno==b.deptno;
全连接

多表连接
连接 n个表,⾄少需要n-1个连接条件。例如:连接三个表,⾄少需要两个连接条件。
hive> SELECT a.ename,b.dname,c.zip FROM emp a JOIN dept b ON a.deptno=b.deptno JOIN location c ON b.loc=c.loc;
注意:为什么不是表b和表c先进⾏连接操作呢?这是因为Hive总是按照从左到右的顺序 执⾏的。
排序
ORDER BY
ORDER BY⽤于对全局查询结果进⾏排序,也就是说会有⼀个所有的数据都通过⼀个 reducer进⾏处理的过程。
SORT BY
Hive增加了⼀个可供选择的⽅式,即SORT BY,其只会在每个reducer中对数据进⾏排 序,即执⾏⼀个局部排序过程。这会保证每个reducer的输出数据都是有序的(但并⾮ 全局有序)。
ORDER BY 和SORT BY的区别是当reducer的个数⼤于1时,两种操作的输出结果是不 同的,SORT BY是reducer内的局部排序。
DISTRIBUTE BY和SORT BY
如果我们想对同⼀部⻔中的员⼯进⾏排序处理,那么我们可以使⽤DISTRIBUTE BY来保 证具有相同部⻔编号的员⼯被分到同⼀个reducer中去,然后使⽤SORT BY来按照我们 的期望对数据进⾏排序。
hive> SELECT * FROM emp DISTRIBUTE BY deptno SORT BY empno DESC;
CLUSTER BY
当distribute by和sorts by字段相同时,可以使⽤cluster by⽅式。 ⽤cluster b除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序 排序,不能指定排序规则为ASC或者DESC。
hive> select * from emp cluster by deptno;
hive> select * from emp distribute by deptno sort by deptno;

类型转换

Hive会在适当的时候对数值型数据类型进⾏隐式类型转换,有些时候需要显示类型转换 时可以使⽤关键字cast。显示类型转换函数的语法是:
cast(value AS TYPE)
ALTER TABLE employees CHANGE COLUMN salary salary STRING;
SELECT name,salary FROM employees WHERE cast(salary AS FLOAT) < 100000.0;

空字段赋值

NVL:给值为NULL的数据赋值,它的格式是NVL( string1, replace_with)。它的功能是如果 string1为NULL,则NVL函数返回replace_with的值,否则返回string1的值,如果两个参数都为 NULL ,则返回NULL。
hive> select nvl(comm,-1) from emp;

学习笔记hive——hive应用——hive导入及导出数据(代码片段)

四、Hive导入及导出数据通过HDFS直接导入导出通过Hive命令导入导出4.1、Hive导入数据的语法LOADDATA[LOCAL]INPATH'filepath'[OVERWRITE]INTOTABLEtablename[PARTITION(partcol1=val1,partcol2=val2...)]LOCAL:导入语句带有LOCALÿ 查看详情

学习笔记hive——hive安装配置(代码片段)

一、环境介绍环境描述4个Linux操作系统虚拟机使用centos7镜像配置安装java1.8以上版本安装Hadoop2.6.5以上版本安装MySQL5.1以上版本二、安装MySQL(这里我是CentOs7)安装教程链接:https://www.jb51.net/article/150557.htm1、安装完成... 查看详情

学习笔记hive——hive开发应用(代码片段)

一、任务1.1、商品零售购物篮分析现代商品种类繁多,顾客往往会由于需要购买的商品众多而变得疲于选择,且顾客并不会因为商品选择丰富而选择购买更多的商品。繁杂的选购过程往往会给顾客疲惫的购物体验。1.2、... 查看详情

学习笔记hive——查询优化(代码片段)

一、视图1.1、Hive的视图视图是基于数据库的基本表进行创建的一种伪表,数据库中储存视图的定义,不存数据项,数据项仍然存在基本表中它可作为一个抽象层,将数据发布给下游用户。目前Hive版本支持逻辑视... 查看详情

学习笔记--hive网站日志统计分析(代码片段)

前言本次实践的目的是结合之前所学flume、hadoop、hive几个主要技术,完成一个小案例。目标:统计出独立ip数量统计一个ip使用的header数量访问最多的url链接每个ip常访问的url单日每小时访问量折线图准备安装并配置好flume... 查看详情

学习笔记hive——自定义函数(代码片段)

一、自定义函数简介1.1、函数类型UDF:用户定义函数UDF操作作用于单个数据行,并且产生一个数据行作为输出。大多数函数都属于这一类(比如数学函数和字符串函数)UDAF:用户定义聚集函数UDAF接受多个输入... 查看详情

学习笔记hive——hive应用——数据库定义创建表(代码片段)

一、任务讲解泰坦尼克号乘客信息存储与分析泰坦尼克号乘客信息存储与分析:创建乘客信息表导入数据到表中统计获救与死亡情况统计舱位分布情况统计港口登船人数分布情况统计性别与生存率的关系统计客舱等级与生存... 查看详情

hive学习笔记(代码片段)

安装配置安装hive下载hive解压重命名添加环境变量Vi/etc/proflie使环境变量生效Source/etc/profile修改配置文件cphive-env.sh.templatehive-env.shHiveMetastore配置将自带的derby数据库替换为mysql数据库参考文章https://my.oschina.net/u/4292373/blog/3497563登录... 查看详情

hive学习笔记:查看添加删除分区(代码片段)

一、查看分区查看分区showpartitionstable_name;/*update_date=20230305update_date=20230312update_date=20230319*/查看分区表描述desctable_namepartition(update_date=20230305);查看外部表,特定指定的位置descextendedtable_namepartition(update_date=20230305);二、添加分区alt... 查看详情

hive学习笔记---用中文创建表名和字段(代码片段)

有些人问能不能用中文来创建表名或者字段,是可以的。这里给一个例子:createtablehehe(`来试试`string);可以这样子建表,大家看到这里的符号 “ ` ” 作用很大,一是可以在建表的时候使用中文,二... 查看详情

学习笔记hive——实例:航空客户价值分析数据预处理(代码片段)

一、背景与目标1.1、背景1.、行业内竞争民航的竞争除了三大航空公司之间的竞争之外,还将加入新崛起的各类小型航空公司、民营航空公司,甚至国外航空巨头。航空产品生产过剩,产品同质化特征愈加明显,... 查看详情

hive笔记整理(代码片段)

[TOC]Hive笔记整理(三)Hive的函数Hive函数分类函数的定义和java、mysql一样,有三种。UDF(UserDefinitionFunction用户定义函数)一路输入,一路输出sin(30°)=1/2UDAF(UserDefinitionAggregationFunction聚合函数)多路输入,一路输出maxmincountsumavg... 查看详情

hive笔记整理(代码片段)

[TOC]Hive笔记整理(二)Hive中表的分类managed_table—受控表、管理表、内部表表中的数据的生命周期/存在与否,受到了表结构的影响,当表结构被删除的,表中的数据随之一并被删除。默认创建的表就是这种表。可以在cli中通过des... 查看详情

hive学习:hive安装(代码片段)

安装前提已安装并配置了Hadoop集群(单机或者全分布都行)软件下载Hive官网:https://hive.apache.org/index.htmlHive安装配置环境变量将下载的Hive包上传到机器中,解压到指定路径编辑/etc/profile,配置Hive的环境变量exportHIVE_HOME=/.../apache-... 查看详情

hive优化笔记(代码片段)

目录减少job数。3.配置角度优化3.1列裁剪4.2分区裁剪3.3JOIN操作3.4MAPJOIN操作3.5GROUPBY操作3.6合并小文件5.程序角度优化5.1熟练使用SQL提高查询5.2无效ID在关联时的数据倾斜问题5.3不同数据类型关联产生的倾斜问题5.4利用Hive对UNIONALL优... 查看详情

hive学习之路hive中文乱码(代码片段)

Hive注释中文乱码创建表的时候,comment说明字段包含中文,表成功创建成功之后,中文说明显示乱码createexternaltablemovie(userIDintcomment‘用户ID‘,movieIDintcomment‘电影ID‘,ratingintcomment‘电影评分‘,timestampedbigintcomment‘评分时间戳‘,... 查看详情

hive学习hive安装(代码片段)

一,文件下载二,hive安装  2.1mysql安装  2.2解压hive  2.3配置文件配置  2.4环境变量配置  2.5 添加mysql的connect的jar包三,hive使用方式  3.1hive直接启动服务  3.2hiveserver2以一个服务的方式启动  3.3hive-e直接脚... 查看详情

hive学习笔记

Hive学习笔记1、Hive安装(只在主节点上安装) (1)下载安装包到/usr/app/目录下 (2)解压 (3)修改配置文件/etc/profile(添加 exportHIVE_HOME=/usr/local/hive-0.9.0-bin exportHADOOP_HOME=/usr/local/hadoop-0.20.2-cdh3u 查看详情