hive入门

简介

基于Hadoop的数据仓库工具,可以将结构化的数据文件映射成一张表,并提供SQL查询功能;

  • Hive可以将SQL语句转化为MapReduce任务执行;
  • 不仅可以分析HDFS文件系统中的数据还可以分析其他存储系统;
数据单元
  • 元数据:数据的各项属性信息;
  • 表:分内部表和外部表,内部表数据存储再数据仓库得目录中,删除内部表时,表数据及其元数据一同被删除;外部表创建时,可以存储在指定的HDFS目录中,也可以存储在数据仓库中,还可以与指定的HDFS目录中的数据相关联,外部表删除时,元数据被删除,实际数据不会被删除;
  • 分区:每个表可以有一个或多个分区
  • 桶:每个分区会根据表某列的数据的哈希值分为若干个桶,每个桶对应分区下的一个数据文件
数据类型
  • 基本数据类型
    • 整型 :TINYINT、SMALLINT、INT、BIGINT
    • 布尔:TRUE/FALSE
    • 浮点:FLOAT、DOUBLE
    • 定型: DECIMAL
    • 字符型: STRING、VARCHAR、CHAR
    • 日期和时间型: TIMESTAMP、DATE
    • 二进制: BINARY
  • 复杂数据类型
    • 结构体
    • 键值对
    • 数组
Hive架构

  • CLI(Command line Interface)
  • HiveServer2:为远程客户端(如Beeline,JDBC)提供可以执行Hive的查询服务;
  • Driver:Hive的一个组件,负责将HiveSQL解析为MapReduce任务,并提交给Hadoop集群;
  • Metastore Server:元数据服务,所有客户端都需要通过Metastore Server来访问存在关系数据库中的元数据;
运行模式
  • 内嵌模式:默认方式,使用内嵌的Derby数据库存储元数据,并将数据存储于磁盘上,只允许一个会话;
    在这里插入图片描述

  • 本地模式:元数据存储于其他关系型数据库,常用MYSQL,支持多会话;

在这里插入图片描述

  • 远程模式:Metastore Server分离出来,作为单独进程,可以部署多个,运行在不同计算机;

在这里插入图片描述

远程安装配置
安装文件下载
  • 官方下载地址:https://dlcdn.apache.org/hive/hive-3.1.3/
  • 解压
tar -zxvf apache-hive-3.1.3-bin.tar.gz -C /home
安装环境变量
sudo vi /etc/profile
//追加内容
export HIVE_HOME=/home/apache-hive-2.3.3-bin
export PATH=$HIVE_HOME/bin:$PATH

source /etc/profile
关联Hadoop
cp hive-env.sh.template hive-env.sh
vim hive-env.sh
//追加
export HADOOP_HOME=/home/hadoop-3.2.4

创建数仓目录
hadoop fs -mkdir  /tmp
hadoop fs -mkdir -p  /user/hive/warehouse hadoop fs -chmod g+w /tmp
hadoop fs -chmod g+w /user/hive/warehouse
配置MYSQL
create database hive_db;
create user hive IDENTIFIED by 'hive';
grant all privileges on hive_db.* to hive@'%';
flush privileges;
配置Hive
  • MySQL的驱动包mysql-connector-java-8.0.11.jar上传到安装目录lib包内
  • hive-site.xml文件
<configuration>
<!--MySQL数据库连接信息 -->
<property><!--连接MySQL的驱动类 -->
<name>javax.jdo.option.ConnectionDriverName</name>
<value>com.mysql.cj.jdbc.Driver</value>
</property>
<property><!--MySQL连接地址,此处连接远程数据库,可根据实际情况进行修改 -->
<name>javax.jdo.option.ConnectionURL</name>
<value>jdbc:mysql://192.168.126.134:3306/hive_db?




createDatabaseIfNotExist=true&amp;useSSL=fasle
</value>
</property>
<property><!--MySQL用户名 -->
<name>javax.jdo.option.ConnectionUserName</name>
<value>hive</value>
</property>
<property><!--MySQL密码 -->
<name>javax.jdo.option.ConnectionPassword</name>
<value>hive</value>
</property>

<property> <!--Hive数据库在HDFS中的存放地址-->
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<property><!--Hive本地缓存目录-->
<name>hive.exec.local.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property><!--Hive在HDFS中的缓存目录-->
<name>hive.exec.scratchdir</name>
<value>/tmp/hive</value>
</property>
<property><!--从远程文件系统中添加资源的本地临时目录-->
<name>hive.downloaded.resources.dir</name>
<value>/tmp/hive</value>
</property>
<property><!--Hive运行时的结构化日志目录-->
<name>hive.querylog.location</name>
<value>/tmp/hive</value>
</property>
<property><!--日志功能开启时,存储操作日志的最高级目录-->
<name>hive.server2.logging.operation.log.location</name>
<value>/tmp/hive</value>
</property>

<!--在Hive提示符中包含当前数据库-->
<property>
<name>hive.cli.print.current.db</name>
<value>true</value>
</property>
<!--在查询输出中打印列的名称-->
<property>
<name>hive.cli.print.header</name>
<value>true</value>
</property>

</configuration>

初始化元数据
schematool -dbType mysql -initSchema
报错1:
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/home/hive-3.1.3/lib/log4j-slf4j-impl-2.17.1.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/home/hadoop-3.2.4/share/hadoop/common/lib/slf4j-reload4j-1.7.35.jar!/org/slf4j/impl/StaticLoggerBinder.class]
解决方案:删除 log4j-slf4j-impl-2.17.1.jar包

报错2:
Exception in thread "main" java.lang.NoSuchMethodError: com.google.common.base.Preconditions.checkArgument(ZLjava/lang/String;Ljava/lang/Object;)V
解决方案:hive内的guava.jar和hadoop内的版本不一致,删除低版本,把高版本复制过去;

linux01安装Hive客户端
#分发安装包
scp -r hive-3.1.3/ linux01:/home
  • linux01节点修改配置文件hive-site.xml,追加以下内容
<!--Hive数据仓库在HDFS中的存储目录-->
<property>
<name>hive.metastore.warehouse.dir</name>
<value>/user/hive/warehouse</value>
</property>
<!--是否启用本地服务器连接Hive,false为非本地模式,即远程模式-->
<property>
<name>hive.metastore.local</name>
<value>false</value>
</property>
<!--Hive服务端Metastore Server连接地址,默认监听端口9083-->
<property>
<name>hive.metastore.uris</name>
<value>thrift://linux00:9083</value>
</property>
  • linux00启动metastore
#启动metastore 
hive --service metastore &
#进入命令行,linux00,linu01均可
hive 
Beeline CLI的使用
用户访问权限

hadoop 开通代理用户访问权限,修改hadoop core-site.xml,添加以下内容

<property>
<name>hadoop.proxyuser.root.hosts</name>
<value>*</value>
</property>
<property>
<name>hadoop.proxyuser.root.groups</name>
<value>*</value>
</property>
启动Beeline
beeline
!connect jdbc:hive2://linux00:10000
用户名root,密码可以空

#或者
beeline -u jdbc:hive2://linux00:10000 -n root

Hive数据库操作
创建数据库
CREATE (DATABASE|SCHEMA) [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path]
[WITH DBPROPERTIES (property_name=property_value, …)];
修改数据库
#修改自定义属性
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES(property_name=property_value, …);

#修改数据库所有者
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;

#修改数据库库存位置
ALTER (DATABASE|SCHEMA) database_name SET LOCATION hdfs_path;

删除数据库
#RESTRICT|CASCADE:约束|级联,默认约束,库内有表不能删除。
DROP (DATABASE|SCHEMA) [IF EXISTS] database_name [RESTRICT|CASCADE];
Hive表操作
内部表
#建表
CREATE TABLE student(id INT,name STRING);
#查看表结构
desc table_name;
#详细表结构
desc formatted tb_name;
#插入数据
INSERT INTO student VALUES(1000,'xiaoming');

#导入数据,

CREATE TABLE score(
sno INT,
name STRING,
score INT)
row format delimited fields terminated by '\t';

load data local inpath '/home/test/score.txt' into table score;

#删除表
drop table tb_name;

外部表
#创建外部表,指定位置或关联位置
create external table ex_tb (id int,name string) row format delimited fields terminated by  ' ' location '/input/hive';

#导入数据
load data local inpath  '/home/test/tb.txt' into table ex_tb;

在这里插入图片描述

分区表

Hive可以使用关键字PARTITIONED BY 对一张表进行分区操作,可以根据某一列的值将表分为多个分区,每个分区对应数仓中的一个目录,查询数据时,根据where田间只查询指定分区,不需要全表扫描;分区类比于mysql索引;
在这里插入图片描述

#创建分区表
create table test_db.student (id int,name string,gender string) partitioned by  (age int ) row format delimited fields terminated by ' ';

#导入数据,age列均为17
load data local  inpath '/home/test/stuent.txt' into table test_db.student partition (age = 17)

#添加分区
ALTER TABLE student ADD PARTITION(age=21);

#删除分区
ALTER TABLE student drop PARTITION(age=21);

#查看分区
show partitions test_db.student;

#查询数据
select * from test_db.student;
分桶表

Hive中可以将表或者分区表进一步细分成桶,是对数据更细粒度的划分,以提高查询效率;

创建表时指定分桶的列及桶的数量,添加数据时,hive对分桶列的值进行哈希计算,并将结果除以桶的个数,最后取余,根据余数分配到不同的桶中;

分区列不能作为分桶列,否则一个分区的数据将全部被分配到同一个桶中;

#创建分桶表
create table user_info (user_id int,name string) clustered by (user_id) into 6 buckets
row format delimited fields terminated by ' ';
创建临时表,分桶表不能直接导入数据
create table user_info_tmp (user_id int,name string) row format delimited fields terminated by ' ';

#导入数据到临时表
load data local inpath '/home/test/userinfo.txt' into table test_db.user_info_tmp ;

#导入数据到分桶表
insert into test_db.user_info select user_id,name from user_info_tmp;

#分桶表数据抽样 x表示从第几个桶开始抽取,分桶的倍数因子,即桶的间隔数;
select * from user_info tablesample(bucket x out of y);
    
表查询
     SELECT [ALL | DISTINCT] select_expr, select_expr, …
       FROM table_reference
       [WHERE where_condition]
       [GROUP BY col_list]
       [ORDER BY col_list]
       [CLUSTER BY col_list
         | [DISTRIBUTE BY col_list] [SORT BY col_list]
       ]
      [LIMIT [offset,] rows]
  • sort by:对进入reducer中的数据进行排序
  • distribute by:控制键值对如何划分到reducer
  • cluster by: 同时具备 sort by和distribute by 的功能 只能升序排列
hive命令
#指定使用的数据库
hive --database test_db

#执行sql语句,非交互界面
hive -e "select * from student;"

#执行本地系统或hdfs系统指定的sql脚本
hive -f /home/test/hive.sql
hive -f hdfs://linux00:8020/input/hive.sql

#设置属性
hive –-hiveconf mapred.reduce.tasks=10
SET mapred.reduce.tasks;
set mapred.reduce.tasks=10

#hive cli 中也可以执行linux shell命令,感叹号开头,分号结尾;

hive与hbase整合

整合的核心是将hive和hbase的表进行绑定,表级别建立映射关系;

修改hive-site.xml
<!--配置ZooKeeper集群的访问地址 -->
<property>
<name>hive.zookeeper.quorum</name>
<value>linux00:2181,linux01:2181,linux02:2181</value>
</property>
<!--配置依赖的HBase、ZooKeeper的jar文件 -->
<property>
<name>hive.aux.jars.path</name>
<value>
file:///home/hbase-2.4.17/lib/hbase-common-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-client-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-server-2.4.17.jar,
file:///home/hbase-2.4.17/lib/hbase-hadoop2-compat-2.4.17.jar,
file:///home/hbase-2.4.17/lib/netty-buffer-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-codec-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-common-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-handler-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-resolver-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-native-epoll-
4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/netty-transport-native-unix-common-
4.1.45.Final.jar,
file:///home/hbase-2.4.17/lib/hbase-protocol-2.4.17.jar,
file:///home/azookeeper-3.6.4/lib/zookeeper-3.6.4.jar
</value>
</property>
hive建表同时创建hbase表
#建表,SERDEPROPERTIES关键字指定映射关系;TBLPROPERTIES关键字只限定hbase表属性信息;
STORED BY关键字指定hive与hbase的通信工具
CREATE TABLE hive_student(id INT,name STRING)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,cf1:name")
TBLPROPERTIES ("hbase.table.name" = "hive_student");
hive创建外部表关联hbase
hive> CREATE EXTERNAL TABLE hive_hbase_student(id int,name string,age int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES (
"hbase.columns.mapping" = ":key,cf1:name,cf1:age"
)
TBLPROPERTIES("hbase.table.name" = "hbase_student");
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值