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
数据格式:系统决定
数据更新:支持
索引:有
执行:底层是执行引擎myisam
和innodb
执行延迟:低
可扩展性:低
数据规模:小
三、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 into 表1 partition(字段名="XXX")
select * from 表2 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 ...