Hive。。

什么是hive?

1、hive是一个运行在分布式应用程序上的一个数据仓库管理工具
2、hive可以将hdfs上的具有结构的文件映射成一张表,,并且提供了类sql的语法来管理和分析这些表(本质就是hdfs上的文件)
3、用于描述文件和表的映射关系的数据叫做元数据,存储在关系型数据库中(mysql,oracle等)
4、默认情况下执行引擎为mapreduce(还有spark等)

hive是干什么的?

1、hive是一个运行在分布式应用程序上的一个数据仓库管理工具
2、hive可以将hdfs上的具有一定结构的文件映射成一张表,,并且提供了类sql的语法来管理和分析这些表(本质就是hdfs上的文件)

为什么要使用hive?

1、直接使用mapreduce的话,代码复杂度要高得多,而且人员学习成本高
2、项目周期要求短
3、mapreduce实现复杂查询逻辑开发难度大

hive的优缺点

优点:

1、学习成本低
提供了类sql查询语言,(简单,容易上手),避免直接写mapreduce(适合java不好,sql熟练),减少开发人员 的学习成本。
2、可扩展性好
hive运行在分布式应用程序上,分布式集群的扩展性是很好的
3、适合做离线分析处理(OLAP)
· hive延迟较高
4、延展性好
hive可以自定义函数
5、良好的容错性
基于分布式应用程序
6、统一管理
提供了统一的元数据管理,将元数据存储到关系型数据库中(mysql,oracle等)

缺点

1、hql的表达能力有限
2、hive本身底层是mapreduce
hive自动生成的mapreduce作业,通常情况下不够智能化
hive调优比较困难
3、延迟比较高,不适合OLTP

hive的架构和原理

hive的架构简介

在这里插入图片描述

hive的体系结构分为以下几部分:
第一层:指的是连接hive的客户端接口层
- CLI (command line interface),指的是hive提供的shell命令(hive -e hive -f hive - i )
- JDBC/ODBC,指的是可以使用编程语言来来连接hive.比如,java,c++,ruby等
- webui, hive提供了web访问接口
第二层:
- thrift server :第三方软件服务项框架,当使用远程方式连接时,需要使用这个服务。
- 元数据存储: 指的是元数据存储的位置,可以是mysql,oracle,derby等
第三层:驱动层
- 解析器(SQLParser):
作用就是解析语法的正确性,比如表是否存在、字段是否存在、SQL语义是否有误。
- 编译器(Compiler):
作用就是将正确的语法翻译成mr程序,会与元数据库进行交互,获取对应的元数据,比如表名对应的文件路径。
最后形成job程序
- 优化器(Optimizer):
将执行计划进行优化,减少不必要的列、使用分区、使用索引等。优化job。
- 执行器(Executer):
将优化后的执行计划提交给hadoop的yarn上执行。提交job。

hive的工作流程

在这里插入图片描述

  1. 用户提交查询等sql任务给Driver。
  2. 驱动程序里的解析器解析Hql语法的正确性,然后发送编译器,生成查询计划。
  3. 编译器Compiler根据用户任务去MetaStore中获取需要的Hive的元数据信息。
  4. 编译器得到元数据信息后,继续对任务进行编译,生成完整的job程序,然后通过优化器进一步优化
  5. 将最终的job程序提交给Driver。
  6. Driver将job程序转交给ExecutionEngine去执行。
  7. 在内部,执行作业的过程是一个MapReduce工作。执行引擎发送作业给yarn(yarn的job执行流程)
    7.1 与此同时,在执行时,执行引擎可以通过Metastore执行元数据操作(比如,create…as select操作)
  8. 执行引擎接收来自数据节点的结果。
  9. 执行引擎发送这些结果值给驱动程序。
  10. 驱动程序将结果发送给Hive接口。

hive与mpreduce的区别、

hive的底层就是mapreduce,hive就是对mapreduce的封装。

hive与传统型数据库的区别

Hive和数据库的比较如下表:

比较项关系数据库Hive
ANSI SQL支持不完全支持
更新UPDATE INSERT DELETEINSERT OVERWRITE\ INTO TABLE
事务支持支持(部分支持)
模式写模式读模式
存储位置块设备、本地文件系统HDFS
延时
多表插入不支持支持
子查询完全支持只能用在From子句中
视图UpdatableRead-only
可扩展性
数据规模
实时响应毫秒级秒级

hive的安装

这里只写本地模式安装和远程模式安装

1、将hive和mysql安装包上传,解压,更名,并且配置环境变量
2、因为安装的是完全分布式,所以需要安装mysql

##1) 卸载mariadb
rpm -qa | grep mariadb

rpm -e --nodeps mariadb-libs-5.5.64-1.el7.x86_64


##2) 上传,拆包
tar -xvf mysql-5.7.28-1.el7.x86_64.rpm-bundle.tar

##3) 安装下面顺序安装mysql
rpm -ivh mysql-community-common-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-libs-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-client-5.7.28-1.el7.x86_64.rpm
rpm -ivh mysql-community-server-5.7.28-1.el7.x86_64.rpm

##4) 启动服务项
[root@qianfeng03 ~]# systemctl start mysqld

##5) 查询服务项
[root@qianfeng03 ~]# systemctl status mysqld

##6)查看临时密码,然后登陆
cat /var/log/mysqld.log | grep password
mysql -uroot -p

##7) 修改密码策略
mysql> set global validate_password_policy=low;
mysql> set global validate_password_length=6;
查看密码策略
mysql> show variables like '%validate_password%';

##8)修改密码
alter user root@localhost identified by '@Mm123123';

##9) 远程授权
grant all privileges on *.* to root@'%' identified by '远程密码' ;

3、设置hive-env.sh

export HIVE_CONF_DIR=/usr/local/hive/conf
export JAVA_HOME=/usr/local/jdk
export HADOOP_HOME=/usr/local/hadoop
export HIVE_AUX_JARS_PATH=/usr/local/hive/lib

4、设置hive-site.xml(conf里原来是没有hive-site.xml的,只需要复制hive-default.xml就行)

<!--hive仓库在hdfs的位置-->
<property>
    <name>hive.metastore.warehouse.dir</name>
    <value>/user/hive/warehouse</value>
</property>

<!-- 该参数主要指定Hive的临时文件存储目录  -->
<property>
    <name>hive.exec.scratchdir</name>
    <value>/tmp/hive</value>
</property>
<!-- 删除所有的内容,只需要配置一下四个即可 -->
<property>
    <name>hive.exec.local.scratchdir</name>
    <value>/usr/local/hive/iotmp/root</value>
</property>
<property>
    <name>hive.downloaded.resources.dir</name>
    <value>/usr/local/hive/iotmp/${hive.session.id}_resources</value>
</property>
<property>
    <name>hive.querylog.location</name>
    <value>/usr/local/hive/iotmp/root</value>
</property>
<property>
    <name>hive.server2.logging.operation.log.location</name>
    <value>/usr/local/hive/iotmp/root/operation_logs</value>
</property>

<!-- 配置metastore服务项连接mysql的参数 -->

<!--配置mysql的连接字符串-->
<property>
    <name>javax.jdo.option.ConnectionURL</name>
    <value>jdbc:mysql://qianfeng03:3306/hive?createDatabaseIfNotExist=true</value>
</property>
<!--配置mysql的连接驱动-->
<property>
    <name>javax.jdo.option.ConnectionDriverName</name>
    <value>com.mysql.jdbc.Driver</value>
</property>
<!--配置登录mysql的用户-->
<property>
    <name>javax.jdo.option.ConnectionUserName</name>
    <value>root</value>
</property>
<!--配置登录mysql的密码-->
<property>
    <name>javax.jdo.option.ConnectionPassword</name>
    <value>@Mm123123</value>
</property>

5、初始化元数据库mysql

schematool -initSchema -dbType mysql

初始化之后就可以在本地运行hive了。
启动hive的命令:

hive

hive命令会内置启动metastore服务来连接关系型数据库获取元数据。

hive的远程模式

远程模式的简介

远程模式就是hive中的相关进程,比如metastore和hiveserver2这样的进程单独开启,使用客户端或者命令行进行远程连接这两个服务,就是远程模式。客户端可以再任何机器上,只要这台机器连接到开启了服务的服务器上,就可以进行操作。

服务端的配置

1、hive-site.xml
hive-site.xml和本地的配置一模一样,如果在本地模式基础上设置,hive-site.xml是不用变的。
2、使用远程模式的话,需要配置hadoop的core-site.xml,添加下面两个属性

<property>
    <name>hadoop.proxyuser.root.hosts</name>
    <value>*</value>
</property>
<property>
    <name>hadoop.proxyuser.root.groups</name>
    <value>*</value>
</property>

hive的两种服务说明

第一种服务:hiveserver2

1. 该服务端口号默认是10000
2. 可以单独启动此服务进程,供远程客户端连接;此服务内置metastore服务。
3. 启动方式:

    方法1:
        直接调用hiveserver2。会进入监听状态不退出。
    方法2:
        hive --service hiveserver2 & 进入后台启动
    方法3:
        hive --service hiveserver2 2>&1 >/dev/null &; #信息送入黑洞。

第二种服务:metastore

1. 此服务才是真正连接元数据库的服务进程
2. 也可以让远程客户端连接
3. 启动方式:
	方法1:
		- hive --service metastore &
	方法2:
    	- hive --service metastore 2>&1 >/dev/null &; #信息送入黑洞。

客户端连接hiveserver2服务

说明:

-1. 连接此服务的hive客户端,只需要配好环境变量即可
-2. 只能使用hive中的beeline连接工具进行连接此服务,beeline是hive的一个轻量级的连接客户端工具。

连接方式:

方式1:
   	step1. beeline 回车
   	step2. !connect jdbc:hive2://qianfeng02:10000 回车
   	step3. 输入用户名 回车
   	step4. 输入密码 回车
方法2(直连):
	1. beeline -u jdbc:hive2://qianfeng02:10000 -n 用户名

解析: 
	hive2,是hive的协议名称
	ip:  hiveserver2服务所在的主机IP。
	10000,是hiveserver2的端口号

客户端连接metastore服务

注意:想要连接metastore服务的客户端必须配置如下属性和属性值

<property>
	<name>hive.metastore.uris</name> 
	<value>thrift://qianfeng02:9083</value>
</property>

解析:thrift:是协议名称
	 ip为metastore服务所在的主机ip地址
     9083是默认端口号

Hive基本操作-库、表

规则

大小写规则:

1. hive的数据库名、表名都不区分大小写
2. 建议关键字大写

命名规则

1. 名字不能使用数字开头
2. 不能使用关键字
3. 尽量不使用特殊符号

库操作语法

创建数据库
创建数据库的本质就是在hive的参数${hive.metastore.warehouse.dir}对应的目录下创建一个新的目录,此目录的名称格式为:库名.db
注意:在创建库或者表时除了创建目录外,还会在元数据库中添加元数据信息(描述信息)描述信息可以在关系型数据库中查看,也可以在hive命令行使用 desc extended tableName来查看

hive> create database zoo;
hive> create database if not exists zoo;
hive> create database if not exists qfdb comment 'this is a database of qianfeng';

** 查看所有数据库**

语法:show databases;

** 切换数据库**

语法:use mydb;

** 查看数据库信息**

语法1:desc database databaseName;
语法2:desc database extended databaseName;
语法3:describe database extended databaseName;

** 删除数据库**

语法1:drop database databasename;         	#这个只能删除空库
语法2:drop database databasename cascade;    	#如果不是空库,则可以加cascade强制删除

表操作语法

数据类型

Hive的数据类型分为基本数据类型和复杂数据类型,下面是基本数据类型(复杂类型到后期再讲)

其中加粗体是重点要掌握的类型

分类类型描述字面量示例
基本类型BOOLEANtrue/falseTRUE
TINYINT1字节的有符号整数 -128~1271Y
SMALLINT2个字节的有符号整数,-32768~327671S
INT4个字节的带符号整数1
BIGINT8字节带符号整数1L
FLOAT4字节单精度浮点数1.0
DOUBLE8字节双精度浮点数1.0
DEICIMAL任意精度的带符号小数1.0
STRING字符串,可变长度“a”,’b’
VARCHAR变长字符串,要设置长度“a”,’b’
CHAR固定长度字符串“a”,’b’
BINARY字节数组无法表示
TIMESTAMP时间戳,纳秒精度122327493795
DATE日期‘2016-03-29’
复杂类型ARRAY有序的的同类型的集合array(1,2)
MAPkey-value,key必须为原始类型,value可以任意类型map(‘a’,1,’b’,2)
STRUCT字段集合,类型可以不同struct(‘1’,1,1.0)
UNION在有限取值范围内的一个值create_union(1,’a’,63)

** 创建表**

创建表的本质其实就是在对应的数据库目录下面创建一个子目录,目录名为表名。数据文件就存在这个目录下。

语法1: 
	create table t_user(id int,name string);  

语法2:使用库.表的形式
	create table mydb.t_user(id int,name string);

语法3:指定分隔规则形式
create table if not exists t1(
uname string comment 'this is name',
chinese int,
math int,
english int
)
comment 'this is my table'
row format delimited   
fields terminated by '\t'
lines terminated by '\n'
stored as textfile;

查看当前表空间中的所有表名

语法:show tables; 
# 查看另外一个数据库中的表
show tables in zoo;

查看表结构

desc tableName
desc extended tableName;
describe extended tableName;

** 修改表结构**

- 修改表名
	alter table oldTableName rename to newTableName;

- 修改列名:change column	
	alter table tableName change column oldName newName colType;
- 修改字段类型:
	alter table tableName change column colName colName colType;


- 修改列的位置:  注意,2.x版本后,必须是相同类型进行移动位置。
	alter table tableName change column colName colName colType after colName1;   
	alter table tableName change column colName colName colType first;




- 增加字段:add columns
	alter table tableName add columns (sex int,...);



- 删除字段:replace columns	#注意,2.x版本后,注意类型的问题,替换操作,其实涉及到位置的移动问题。
	alter table tableName replace columns(
    id int,
    name int,
    size int,
    pic string
    );
	注意:实际上是保留小括号内的字段。

** 删除表**

drop table tableName;

扩展)建表语法

下面是一个常见的创建表的语法:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] TABLENAME(
[COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...])
[COMMENT 'TABLE COMMENT']
[PARTITIONED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...)]
[CLUSTERED BY (COLUMNNAME COLUMNTYPE [COMMENT 'COLUMN COMMENT'],...) [SORTED BY (COLUMNNAME [ASC|DESC])...] INTO NUM_BUCKETS BUCKETS]
[ROW FORMAT ROW_FORMAT]
[STORED AS FILEFORMAT]
[LOCATION HDFS_PATH];

如果要看完整的创建表语法,可以参考下面完整创建表语句:

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name   
-- (Note: TEMPORARY available in Hive 0.14.0 and later)

[(col_name data_type [column_constraint_specification] [COMMENT col_comment], ... [constraint_specification])]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[SKEWED BY (col_name, col_name, ...)     -- (Note: Available in Hive 0.10.0 and later)]
ON ((col_value, col_value, ...), (col_value, col_value, ...), ...)
[STORED AS DIRECTORIES]

[
[ROW FORMAT row_format] 
[STORED AS file_format]
| STORED BY 'storage.handler.class.name' [WITH SERDEPROPERTIES (...)]  -- (Note: Available in Hive 0.6.0 and later)
]

[LOCATION hdfs_path]

[TBLPROPERTIES (property_name=property_value, ...)]  
-- (Note: Available in Hive 0.6.0 and later)

[AS select_statement];   
-- (Note: Available in Hive 0.5.0 and later; not supported for external tables)

其中具体创建表的参数类型可以参考如下:

data_type
  : primitive_type
  | array_type
  | map_type
  | struct_type
  | union_type  -- (Note: Available in Hive 0.7.0 and later)
 
primitive_type
  : TINYINT
  | SMALLINT
  | INT
  | BIGINT
  | BOOLEAN
  | FLOAT
  | DOUBLE
  | DOUBLE PRECISION -- (Note: Available in Hive 2.2.0 and later)
  | STRING
  | BINARY      -- (Note: Available in Hive 0.8.0 and later)
  | TIMESTAMP   -- (Note: Available in Hive 0.8.0 and later)
  | DECIMAL     -- (Note: Available in Hive 0.11.0 and later)
  | DECIMAL(precision, scale)  -- (Note: Available in Hive 0.13.0 and later)
  | DATE        -- (Note: Available in Hive 0.12.0 and later)
  | VARCHAR     -- (Note: Available in Hive 0.12.0 and later)
  | CHAR        -- (Note: Available in Hive 0.13.0 and later)
 
array_type
  : ARRAY < data_type >
 
map_type
  : MAP < primitive_type, data_type >
 
struct_type
  : STRUCT < col_name : data_type [COMMENT col_comment], ...>
 
union_type
   : UNIONTYPE < data_type, data_type, ... >  -- (Note: Available in Hive 0.7.0 and later)
 
row_format
  : DELIMITED [FIELDS TERMINATED BY char [ESCAPED BY char]] [COLLECTION ITEMS TERMINATED BY char]
        [MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]
        [NULL DEFINED AS char]   -- (Note: Available in Hive 0.13 and later)
  | SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value, property_name=property_value, ...)]
 
file_format:
  : SEQUENCEFILE
  | TEXTFILE    -- (Default, depending on hive.default.fileformat configuration)
  | RCFILE      -- (Note: Available in Hive 0.6.0 and later)
  | ORC         -- (Note: Available in Hive 0.11.0 and later)
  | PARQUET     -- (Note: Available in Hive 0.13.0 and later)
  | AVRO        -- (Note: Available in Hive 0.14.0 and later)
  | JSONFILE    -- (Note: Available in Hive 4.0.0 and later)
  | INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname
 
column_constraint_specification:
  : [ PRIMARY KEY|UNIQUE|NOT NULL|DEFAULT [default_value]|CHECK  [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]
 
default_value:
  : [ LITERAL|CURRENT_USER()|CURRENT_DATE()|CURRENT_TIMESTAMP()|NULL ] 
 
constraint_specification:
  : [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, PRIMARY KEY (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name FOREIGN KEY (col_name, ...) REFERENCES table_name(col_name, ...) DISABLE NOVALIDATE 
    [, CONSTRAINT constraint_name UNIQUE (col_name, ...) DISABLE NOVALIDATE RELY/NORELY ]
    [, CONSTRAINT constraint_name CHECK [check_expression] ENABLE|DISABLE NOVALIDATE RELY/NORELY ]

数据导入

[root@qianfeng01 hive]# mkdir /hivedata
[root@qianfeng01 hive]# cd /hivedata
[root@qianfeng01 hive]# vi user.txt
-- 加入下面的徐盛数据
1,廉德枫
2,刘浩
3,王鑫
4,司翔

加载数据到Hive,一般分为两种:

- 一种是从本地Linux上加载到Hive中
- 另外一种是从HDFS加载到Hive中

**方法1:**使用hdfs dfs -put将本地文件上传到表目录下

hdfs dfs -put ./u1.txt /user/hive/warehouse/mydb1.db/u1

**方法2:**在hive中使用load 命令

load data [local] inpath '文件路径' [overwrite] into table 表名

加载数据时:
1. 最好是写绝对路径,从根开始写。
2. 写相对路径也是可以的,但是一定要记住你登录hive时的位置,从当前位置写相对路径
3. ~在hive中,是相对路径的写法
4. 使用benline工具进行远程登录(客户端与服务端不在同一台机器)时,使用以下语句时:
	load data local inpath '文件路径' [overwrite] into table 表名
	会有一个大坑:local是指服务端的文件系统。

**方法3:**从另外一张表(也可称之为备份表)中动态加载数据

insert into table tableName2 select [.....] from tableName1;


扩展内容:向多张表中插入数据的语法
    from tableName1
    insert into tableName2 select * where 条件
    insert into tableName3 select * where 条件
    .....

注意 tableName2表中的字段个数必须和tableName1表中查询出来的个数相同

**方法4:**克隆表数据

- create table if not exists tableName2 as select [....] from tableName1;
- create table if not exists tableName2 like tableName1 location 'tableName1的存储目录的路径'

扩展内容:只复制表结构
create table if not exists tableName2 like tableName1;

加载数据的本质

  1. 如果数据在本地,加载数据的本质就是将数据copy到hdfs上的表目录下。
  2. 如果数据在hdfs上,加载数据的本质是将数据移动到hdfs的表目录下。

注意:hive使用的是严格的读时模式:加载数据时不检查数据的完整性,读时发现数据不对则使用NULL来代替。
而mysql使用的是写时模式:在写入数据时就进行检查

案例演示

CREATE TABLE flow(
id             string COMMENT 'this is id column',
phonenumber     string,
mac             string,
ip               string,
url              string,
urltype          string,
uppacket		 int,
downpacket       int,
upflow            int,
downflow         int,
issuccess    int
)
COMMENT 'this is log table'
ROW FORMAT DELIMITED 
FIELDS TERMINATED BY '\t'
LINES TERMINATED BY '\n'
stored as textfile;

加载数据:
load data local inpath './data/HTTP_20130313143750.dat' into table flow;

1、统计每个电话号码的总流量(M)
select l.phonenumber,
round(sum(l.upflow + l.downflow) / 1024.0,2) as total
from log1 l
group by l.phonenumber
;

2、第二个需求,求访问次数排名前3的url:
select l.url url,
count(l.url) as urlcount
from log1 l
group by l.url
order by urlcount desc
limit 3
;

数据导出

hive数据导出分类

1. 从hive表中导出本地文件系统中(目录、文件)
2. 从hive表中导出hdfs文件系统中
3. hive表中导出到其它hive表中

导出到目录下

--1. 导出数据到本地文件系统的目录下
insert overwrite local directory '/root/out/00'
select * from student;

--2. 导出数据到hdfs的目录下
insert overwrite directory '/root/out/01'
select * from student;

-- 导出的文件中字段默认不分隔。

直接导入到本地文件系统的文件中:

[root@qianfeng01 ~]# hive -e 'select * from exercise.student' >> /root/out/02;
-- 导出的文件中字段分隔符默认是\t

修改导出后的列与列之间的格式:

insert overwrite local directory '/root/out/01'
row format delimited fields terminated by ','
select * from student;

表类型详解

表分类

在Hive中,表类型主要分为两种,

第一种:内部表

- 也叫管理表
- 表目录会创建在集群上的{hive.metastore.warehouse.dir}下的相应的库对应的目录中。
- 默认创建的表就是内部表

第二种:外部表

- 外部表需要使用关键字"external",
- 外部表会根据创建表时LOCATION指定的路径来创建目录,
- 如果没有指定LOCATION,则位置跟内部表相同,一般使用的是第三方提供的或者公用的数据。
- 建表语法:必须指定关键字external。
	create external table tableName(id int,name string) [location 'path'];

内部表和外部表转换:

内部表转外部表

alter table tableName set tblproperties('EXTERNAL'='TRUE');
注意:内部表转外部表,true一定要大写;

外部表转内部表

alter table tableName set tblproperties('EXTERNAL'='false');
说明:false不区分大小

两者之间区别

1) 内部表和外部表在创建时的差别

就差两个关键字,EXTERNAL 和 LOCATION
举例:

- 内部表 -- CRAATE TABLE T_INNER(ID INT);
- 外部表 -- CREATE EXTERNAL TABLE T_OUTER(ID  INT) LOCATION 'HDFS:///AA/BB/XX'; 

2) Hive表创建时要做的两件事

  1. 在hdfs下创建表目录

  2. 在元数据库mysql创建相应表的描述数据(元数据)

3) drop时有不同的特性
1、drop时,元数据都会被清除
2、drop时,内部表的表目录会被删除,但是外部表的表目录不会被删除。

4) 使用场景

内部表: 平时用来测试或者少量数据,并且自己可以随时修改删除数据.

外部表:使用后数据不想被删除的情况使用外部表(推荐使用)所以,整个数据仓库的最底层的表使用外部表

Hive Shell技巧

查看所有hive参数

# 在hive命令行直接输入set 即可
hive>  set

只执行一次Hive命令

通过shell的参数 -e 可以执行一次就运行完的命令

[root@qianfeng01 hive]#  hive -e "select * from cat"

小技巧2:可以通过外部命令快速查询某个变量值:

hive -S -e “set” |grep cli.print

-S 是静默模式,会省略到多余的输出

单独执行一个sql文件

通过参数-f +file文件名就可以,经常用在以后的sql文件单独执行,导入数据场景中

[root@qianfeng01 hive]#  hive -f /path/cat.sql

小技巧:在shell内部 可以通过source命令来执行一个sql

执行Linux命令

在Hive的shell中 加上前缀! 最后以分号;结尾,可以执行linux的命令

hive>   ! pwd ;

执行HDFS命令

用户可以在Hive的shell中执行HDFS的DFS命令,不用敲入前缀hdfs或者hadoop

hive> dfs -ls /tmp

使用历史命令和自动补全

在Hive的Shell操作中可以使用上下箭头查看历史记录

如果忘记了命令可以用tab键进行补全

显示当前库:

下面是通过配置文件hive-site.xml显示

<property>
    <name>hive.cli.print.current.db</name>
    <value>false</value>
    <description>Whether to include the current database in the Hive prompt.</description>
</property>

当前session里设置该参数:

hive> set hive.cli.print.current.db=true;

查看当前参数设置的值:

小技巧1:可以在shell中输入set命令,可以看到hive已经设定好的参数

 hive> set hive.cli.print.current.db;

Hive基本查询语法

基本使用规则

6.1.1 基本查询语句组成

select ..
from ..
	join [tableName] on ..
	where ..
	group by ..
	having ..
	order by ..
	sort by ..
	limit ..
union | union all ...

6.1.2 执行顺序

第一步: FROM <left_table>
第二步: ON <join_condition>
第三步: <join_type> JOIN <right_table>
第四步: WHERE <where_condition>
第五步: GROUP BY <group_by_list>
第六步: HAVING <having_condition>
第七步: SELECT
第八步: DISTINCT <select_list>
第九步: ORDER BY <order_by_condition>
第十步: LIMIT <limit_number>

标准sql语句的一些规则:
-1. 列别名的使用,必须完全符合执行顺序,不能提前使用。(mysql除外)
-2. 在分组查询时,select子句中只能含有分组字段和聚合函数,不能有其他普通字段。(mysql除外)

6.1.3 查询原则

1. 尽量不使用子查询、尽量不使用in 或者not in (可以使用 [not] exists替代)
2. 尽量避免join连接查询,但是通常避免不了
3. 查询永远是小表驱动大表(小表作为驱动表)
  --注意:内连接时,默认是左表是驱动表,因此左表一定要是小表。
  --	 外连接看需求而定。  

6.2 常用子句回顾

6.2.1 where语句特点

where后不能使用聚合函数,可以使用子查询,也可以是普通函数。
条件可以是:
1. 关系表达式: =, >,>=,<,<=,!=,<>
2. 连接符号:  or,and, between .. and ..
3. 模糊查询: like   
			 %:通配符
			 _:占位符
4. [not] in
    >all(set)  >any();


注意事项:在hive的where中如果使用了子查询作为条件,等号“=”不好使,需要使用[not] in.
		换句话说,即使子查询返回的是唯一的一个值,也是集合形式。
		

6.2.2 group by语句特点

group by: 分组,通常和聚合函数搭配使用

查询的字段要么出现在group by 后面,要么出现在聚合函数里面

聚合函数:count(),sum(),max(),min(),avg()

count的执行
1. 执行效果上:
	- count(*)包括了所有的列,相当于行数,在统计结果的时候不会忽略null值
	- count(1)包括了所有列,用1代表行,在统计结果的时候也不会忽略null值
	- count(列名)只包括列名那一列,在统计结果时,会忽略null值

2.执行效率上:
	- 列名为主键,count(列名)会比count(1)快
	- 列名不为主键,count(1)会比count(列名)快
	- 如果表中有多个列并且没有主键,count(1)的效率高于count(*)
	- 如果有主键count(主键)效率是最高的
	- 如果表中只有一个字段count(*)效率最高

6.2.3 having子句特点

对分组以后的结果集进行过滤。可以使用聚合函数。

6.2.4 order by子句

对查询的数据进行排序。
desc 降序
asc	 升序

语法:
order by colName [desc|asc][,colName [desc|asc]]

6.2.5 limit语句特点

limit : 从结果集中取数据的条数
将set hive.limit.optimize.enable=true 时,limit限制数据时就不会全盘扫描,而是根据限制的数量进行抽样。

同时还有两个配置项需要注意:
hive.limit.row.max.size        这个是控制最大的抽样数量
hive.limit.optimize.limit.file 这个是抽样的最大文件数量


注意:limit 在mysql中 可以有两个参数 limit [m,] n
	       在hive中,只能有一个参数 limit n;  查询前n条。
	  一般情况下,在使用limit时,都会先order by排序。     

6.2.6 union | union all

union all:将两个或者多个查询的结果集合并到一起。不去重
union:将两个或者多个查询的结果集合并到一起,去重合并后的数据并排序
union语句字段的个数要求相同,字段的顺序要求相同。	

join连接

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值