hive创建表存储位置在hdfs路径:/user/hive/warehouse 可网页查看
根据表名自动创建对应存储目录
注意所有启动在atguigu用户名下启动
查看运行情况,命令:/home/atguigu/bin/jpsall
开启hadoop,已经配置了脚本启动集群:/home/atguigu/bin/myhadoop.sh start
开启metastore,在任意路径:hive --service metastore
开启hive:/opt/module/hive/bin/hive
开启hiveserver2:/opt/module/hive/bin/hive --service hiveserver2
开启beeline客户端 如果连不上 多连几次 就可能连得上
在任何路径下,输入命令:beeline
然后输入命令:!connect jdbc:hive2://hadoop102:10000
在输入用户名:atguigu
在输入用户名对应开机密码:123321
开启mysql:systemctl start mysqld
使用元数据方法连接hvie
开启hadoop集群,metastore,开启hive即可;
使用jdbc方法连接hive
开启hadoop集群,metastore,hiveserver2,开启beeline客户端即可;
退出beeline,命令:!quit
退出hive,命令:quit
查看当前所有的配置信息,命令:hive>set;
配置文件方式 默认配置文件:hive-default.xml 用户自定义配置文件:hive-site.xml
注意:用户自定义配置会覆盖默认配置。另外,Hive 也会读入 Hadoop 的配置,因为 Hive
是作为 Hadoop 的客户端启动的,Hive 的配置会覆盖 Hadoop 的配置。配置文件的设定对本
机启动的所有 Hive 进程都有效。
Hive 有三种复杂数据类型 ARRAY、MAP 和 STRUCT。ARRAY 和 MAP 与 Java 中的 Array
和 Map 类似,而 STRUCT 与 C 语言中的 Struct 类似,它封装了一个命名字段集合,复杂数据
类型允许任意层次的嵌套。
在 hive cli 命令窗口中如何查看 hdfs 文件系统,命令:dfs ls /;
查看hive历史命令,进入到当前用户的根目录 /root 或/home/atguigu, 命令:cat .hivehistroy
注意有个点
查看集群运行转态:/home/atguigu/bin/jpsall
1.基础入门:https://juejin.cn/post/6844904005756272654
2.开启hive 需要到hive安装目录下的bin目录 点击hive启动
3.select * from emp where ename RLIKE '[A]'; 特殊正则表达式 relike进行匹配
4.满外连接:将会返回所有表中符合 WHERE 语句条件的所有记录。如果任一表的指定字段没有符合条件的值的话,那么就使用 NULL 值替代。
1.缺少mysql与connector:百度网盘:https://pan.baidu.com/s/1Y76xSBscsB9_qQa1gwXLVA lqi4
2.安装mysql出错解决方案:https://blog.csdn.net/qq_35155680/article/details/115267192
3.对应包
sudo rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
sudo rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm
4.新写hive-site.xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- jdbc 连接的 URL -->
<property>
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://hadoop102:3306/metastore?useSSL=false</value>
</property>
<!-- jdbc 连接的 Driver-->
<property>
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<!-- jdbc 连接的 username-->
<property>
<name>javax.jdo.option.ConnectionUserName</name>
<value>root</value>
</property>
<!-- jdbc 连接的 password -->
<property>
<name>javax.jdo.option.ConnectionPassword</name>
<value>root</value>
</property>
<!-- Hive 元数据存储版本的验证 -->
<property>
<name>hive.metastore.schema.verification</name>
<value>false</value>
</property>
<!--元数据存储授权-->
<property>
<name>hive.metastore.event.db.notification.api.auth</name>
<value>false</value>
</property>
<!-- Hive 默认在 HDFS 的工作目录 -->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
</configuration>
5.写上面文件时出错:原因我写了头行留了一行起来,xml文件不能留行,删掉行即可:参考链接:https://blog.csdn.net/chs007chs/article/details/54135527
6.经过mysql初始化元数据后,再次启动hive则出错,解决方案:https://blog.csdn.net/qy20115549/article/details/53994525
7.开启beeline有误,看自己博客写的解决方案;
数据
songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long
guan_beijing
yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
8.创建测试test表
create table
test( name string,
children map<string, int>,
address struct<street:string, city:string>)
row format delimited fields terminated by ','
collection items terminated by '_'
map keys terminated by ':'
lines terminated by '\n';
9.创建一个库并指定在hdfs存储位置,命令:create database if not exists db_hive location '/db_hive2.db';
加载本地数据,命令:load data local inpath '/opt/module/hive/datas/test.txt' into table test;
10.查看库详情、所属位置,命令:desc database db_hive;
11.删除库,命令:drop database db_hive2;
12.EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时可以指定一个指向实
际数据的路径(LOCATION),在删除表的时候,内部表的元数据和数据会被一起删除,而外
部表只删除元数据,不删除数据。
13.默认创建的表都是所谓的管理表(MANAGED_TABLE),有时也被称为内部表。因为这种表,Hive 会(或多或
少地)控制着数据的生命周期。 Hive 默认情况下会将这些表的数据存储在由配置项hive.metastore.warehouse.dir(例如,/user/hive/warehouse)所定义的目录的子目录下。 当我
们删除一个管理表时,Hive 也会删除这个表中数据。管理表不适合和其他工具共享
数据。
注意:创建表不添加 external 关键字 则为内部表
14.因为表是外部表(EXTERNAL_TABLE),所以 Hive 并非认为其完全拥有这份数据。删除该表并不会删除掉这
份数据,不过描述表的元数据信息会被删除掉。
注意:创建表时添加了 external 关键字 则为外部表
例子:create external table if not exists
emp( empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';
管理表和外部表的使用场景
每天将收集到的网站日志定期流入 HDFS 文本文件。在外部表(原始日志表)的基础上
做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过 SELECT+INSERT 进入内部表。
15.查询表的类型和表具体各种详细信息,命令:desc formatted student2;
修改内部表 student2 为外部表
alter table student2 set tblproperties('EXTERNAL'='TRUE');
修改外部表 student2 为内部表
alter table student2 set tblproperties('EXTERNAL'='FALSE');
注意:('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE')为固定写法,区分大小写!
16、向表中装载数据(Load)
hive> load data [local] inpath '数据的 path' [overwrite] into table
student [partition (partcol1=val1,…)];
(1)load data:表示加载数据
(2)local:表示从本地加载数据到 hive 表;否则从 HDFS 加载数据到 hive 表
(3)inpath:表示加载数据的路径
(4)overwrite:表示覆盖表中已有数据,否则表示追加
(5)into table:表示加载到哪张表
(6)student:表示具体的表
(7)partition:表示上传到指定分区
17、Insert 导出
将查询的结果导出到本地
hive (default)> insert overwrite local directory
'/opt/module/hive/data/export/student'
select * from student;
将查询的结果格式化导出到本地
hive(default)>insert overwrite local directory
'/opt/module/hive/data/export/student1'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
将查询的结果导出到 HDFS 上(没有 local)
hive (default)> insert overwrite directory '/user/atguigu/student2'
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
select * from student;
18.import导入
Import 数据到指定 Hive 表中
hive (default)> import table student2
from '/user/hive/warehouse/export/student';
注意:先用 export 导出后,再将数据导入。
19.排序
19.1、全局排序(Order By)
Order By:全局排序,只有一个 Reducer
19.2、每个 Reduce 内部排序(Sort By)
Sort By:对于大规模的数据集 order by 的效率非常低。在很多情况下,并不需要全局排 序,此时可以使用 sort by。
Sort by 为每个 reducer 产生一个排序文件。每个 Reducer 内部进行排序,对全局结果集 来说不是排序。
注意:此时必须设置reduce个数
设置 reduce 个数:set mapreduce.job.reduces=3;
查看设置 reduce 个数:set mapreduce.job.reduces;
例子:hive (default)> insert overwrite local directory '/opt/module/datas/sortby-result'
select * from emp sort by deptno desc;
19.3、分区(Distribute By)
Distribute By: 在有些情况下,我们需要控制某个特定行应该到哪个 reducer,通常是为 了进行后续的聚集操作。distribute by 子句可以做这件事。distribute by 类似 MR 中 partition
(自定义分区),进行分区,结合 sort by 使用。
对于 distribute by 进行测试,一定要分配多 reduce 进行处理,否则无法看到 distribute by 的效果。
注意:此时必须设置reduce个数
设置 reduce 个数:set mapreduce.job.reduces=3;
查看设置 reduce 个数:set mapreduce.job.reduces;
distribute by 的分区规则是根据分区字段的 hash 码与 reduce 的个数进行模除后, 余数相同的分到一个区。
Hive 要求 DISTRIBUTE BY 语句要写在 SORT BY 语句之前。
例子:insert overwrite local directory
'/opt/module/data/distribute-result' select * from emp distribute by deptno sort by empno desc;
19.4、Cluster By
当 distribute by 和 sorts by 字段相同时,可以使用 cluster by 方式。
cluster by 除了具有 distribute by 的功能外还兼具 sort by 的功能。但是排序只能是升序 排序,不能指定排序规则为 ASC 或者 DESC。
注意:按照部门编号分区,不一定就是固定死的数值,可以是 20 号和 30 号部门分到一 个分区里面去。
hive (default)> select * from emp cluster by deptno;
hive (default)> select * from emp distribute by deptno sort by deptno;
20.分区表
分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率 会提高很多
例子:创建分区表:hive (default)> create table dept_partition( deptno int, dname string, loc string)
partitioned by (day string)
row format delimited fields terminated by '\t';
加载数据:hive (default)> load data local inpath
'/opt/module/hive/datas/dept_20200401.log' into table dept_partition partition(day='20200401');
查看分区表数据:select * from dept_partition where day='20200401' or day='20200402' or day='20200403';
还可以进行增加分区或删除分区
增加分区
hive (default)> alter table dept_partition add partition(day='20200405') partition(day='20200406');
删除分区
hive (default)> alter table dept_partition drop partition (day='20200406');
查看分区表有多少分区
hive> show partitions dept_partition;
还有二级分区,可参考文档
还有把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式,可参考文档
还有动态分区调整,可参考文档
21.分桶表
分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理 的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围 划分。
分桶是将数据集分解成更容易管理的若干部分的另一个技术。 分区针对的是数据的存储路径;分桶针对的是数据文件。
例子:创建表:create table stu_buck(id int, name string) clustered by(id)
into 4 buckets
row format delimited fields terminated by '\t';
加载数据:load data inpath '/student.txt' into table stu_buck;
查看表: select * from stu_buck;
分桶规则:根据结果可知:Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方 式决定该条记录存放在哪个桶当中
分桶表操作需要注意的事项:
(1)reduce 的个数设置为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个 数设置为大于等于分桶表的桶数
(2)从 hdfs 中 load 数据到分桶表中,避免本地文件找不到问题
(3)不要使用本地模式
分桶表的抽样查询
对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结 果。Hive 可以通过对表进行抽样来满足这个需求。
语法: TABLESAMPLE(BUCKET x OUT OF y)
查询表 stu_buck 中的数据。
hive (default)> select * from stu_buck tablesample(bucket 1 out of 4 on id);
注意:x 的值必须小于等于 y 的值,否则
22、常用系统函数,自定义 UDTF 函数,参考文档
23、存储格式与压缩,参考文档
24、优化,参考文旦25、驱动demo
package com.bigdata.hive.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* 使用前必须开启hiveserver2
* 利用jdbc的方式访问hiveserver2
*/
public class HiveJdbc {
public static void main(String[] args) throws Exception {
//加载驱动(hive会自动读取驱动,可省略)
Class.forName("org.apache.hive.jdbc.HiveDriver");
//创建连接
Connection connection = DriverManager.getConnection("jdbc:hive2://hadoop102:10000", "atguigu", "123321");
//准备sql
String sql="show tables";
//预编译sql
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//执行sql
ResultSet resultSet = preparedStatement.executeQuery();
while(resultSet.next()){
System.out.println(resultSet.getString(1));
}
}
}