Hive知识点总结

一、启动Hive和zeppelin

1、开启虚拟机
2、启动hadoop所有进程:start-all.sh
3、启动hive:nohup hiveserver2 2>/dev/null &
beeline -u jdbc:hive2://192.168.xx.xx:10000
4、启动zeppelin:进入zeppelin安装bin目录下输入
[root@hadoop2 bin]# ./zeppelin-daemon.sh start
5、打开浏览器输入url
192.168.xx.xx:8000

二、Hive和Mysql的主要区别

Hive:
查询语言:HQL
数据存储位置:HDFS
数据格式:用户定义
数据更新:不支持
索引:无
执行:底层是Mapreduce
执行延迟:高
可扩展性:高
数据规模:大

Mysql:
查询语言:SQL
数据存储位置:local fs
数据格式:系统决定
数据更新:支持
索引:有
执行:底层是执行引擎myisaminnodb
执行延迟:低
可扩展性:低
数据规模:小

三、hive中的数据类型

1、基本数据类型

tinyint smallint int bigint float double decimal binary boolean string char varchar date timestamp

2、复杂数据类型

ARRAY:存储的数据为相同类型
MAP:具有相同类型的键值对
STRUCT:封装了一组字段
实例:

create external table empolyee_id(
name string,
id int,
address array<string>,
genderAndAge struct<gender:string,age:int>,
jobAndSalary map<string,int>,
depAndLvl map<string,string>
)
row format delimited
fields terminated by '|'
collection items terminated by ','
map keys terminated by ':'
lines terminated by '\n'
stored as Textfile
location "/test/hive/empolyee_id/";

在这里插入图片描述

3、元数据结构

数据结构描述逻辑关系物理存储(HDFS)
Database数据库表的集合文件夹
Table行数据的集合文件夹
Partition分区用于分割数据文件夹
Buckets分桶用于分布数据文件
Row行记录文件中的行
Columns列记录每行中指定的位置
Views视图逻辑概念,可跨越多张表不存储数据
Index索引记录统计数据信息文件夹

四、内部表和外部表

分为内部表和外部表内部表(管理表)

内部表
HDFS中为所属数据库目录下的子文件夹
数据完全由Hive管理,删除表(元数据)会删除数据外部表(External Tables)
外部表
数据保存在指定位置的HDFS路径中
Hive不完全管理数据,删除表(元数据)不会删除数据

五、hive-创建表

详细内容见上一篇博客:建表语句

补充:Hive建表–Storage SerDe

SerDe:. Serializer and Deserializer
Hive支持不同类型的Storage SerDe
LazySimpleSerDe: TEXTFILE
BinarySerializerDeserializer: SEQUENCEFILE
ColumnarSerDe:ORC, RCFILE
ParquetHixeSerDe: PARQUET
AvroSerDe:AVRO
JSONSerDe
ReaExSerDe
HBaseSerDe

实例:.CSV文件:

create external table cust_detail(
cid string,
begin_date string,
mixmum_cust_no string,
mixmum_cust_name string,
cust_org string,
cust_dep string,
)
row format SerDe
"org.apache.hadoop.hive.serde2.OpenCSVSerde"
with serdeproperties(
"serparetorChar"=",",  //列以 “,”分隔
"quoteChar"="\"",    //字段内容引用字符,引号里的作为字段,可忽略引号中的分隔符
"escapeChar"="\\"   //转义字符
)
stored as textfile
location "/test/hive/customer/";

六、hive-分区和分桶

6.1 分区

创建分区

create table 表名(
字段1 属性,...
)
partitioned by (字段名 属性...)    //注意这个分区中的字段名最好不要和表中的字段名相同
row format ...;

插入数据

方式一:

Load data local inpath '..../.txt' into table xxx partition(month='xxx');

方式二:

insert into1 partition(字段名="XXX")
select * from2 where 条件;

6.2 设置动态分区

除非业务需要或者数据迁移,否则不建议使用动态分区

set mapred.mode=strict //设置严格模式
set mapred.mode=nonstrict //关闭严格模式
set hive.exec.dynamic.partition=true; //设置动态分区
set hive.exec.dynamic.partition.mode=nonstrict; //设置动态分区非严格模式
set yarn.scheduler.minimum-allocation-mb=3072; //yarn虚拟内存,默认1024
set hive.exec.max.dynamic.partitions.pernode=2000; //设置最大分区数,默认100

6.3 分桶

第一步:设置分桶数量

hive> set hive.enforce.bucketing=true;
hive> set hive.mapreduce.job.num=8;
hive> set hive.mapreduce.reduce.num=8;
hive> set hive.mapred.reduce.tasks=8;

第二步:创建分桶表

create table 表名(字段1 属性...)
clustered by (字段名) into 8 buckets   //分桶数量最好的2的n次方
row format...;

第三步:插入数据

insert into 表名
select * from 其他表;

第四步:随机抽样

select * from cust_detail_bucket tablesample(bucket 1 out of 8 on rand()) s; //一般不用
select * from cust_detail_bucket tablesample(bucket 1 out of 8 on trade_account_id) s; //一般使用这个
select * from 表名 tablesample(2M) s; //大小
select * from 表名 tablesample(10 percent) s;//百分比
select * from 表名 tablesample(10 rows) s;//行数

6.4 分区和分桶的区别

Hive分区:

Hive的分区使用HDFS的子目录功能实现。每一个子目录包含了分区对应的列名和每一列的值。但是由于HDFS并不支持大量的子目录,这也给分区的使用带来了限制。我们有必要对表中的分区数量进行预估,从而避免因为分区数量过大带来一系列问题。
Hive查询通常使用分区的列作为查询条件。这样的做法可以指定MapReduce任务在HDFS中指定的子目录下完成扫描的工作。HDFS的文件目录结构可以像索引一样高效利用。

为什么要分桶?
在分区数量过于庞大以至于可能导致文件系统崩溃时,我们就需要使用分桶来解决问题了。
分区中的数据可以被进一步拆分成桶,不同于分区对列直接进行拆分,桶往往使用列的哈希值对数据打散,并分发到各个不同的桶中
在数据量足够大的情况下,分桶比分区,更高的查询效率。

七、hive-视图

hive的视图创建和mysql语法相同,作用和特性也相同,将查询的结果临时保存起来,作为视图,视图会实时展示原表的变化,且视图的增删改不会影响原表(前提不是单表形成的视图);

# 创建视图
create view view_name as select ...
0
# 删除视图
drop view view_name;

# 更改视图定义
alter view view_name as select ...

八、hive-高级查询

8.1 Mapjoin

8.2 hive集合操作

8.3 hive装载数据

8.4 导入导出数据

8.5 hive数据排序

8.6 hive聚合运算

8.7 hive窗口函数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值