Hive入门学习

一、HIVE概念。
1.Hadoop一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的类SQL查询功能,
可以将HQL语句转换为MapReduce任务进行运行。
2.Hive适用于大数据集的批处理作业,例如:网络日志分析。
不适用于:
不能在大规模数据集上实现低延迟快速的查询。例如:Hive在几百MB的数据集上执行查询一般有分钟级的延迟。
不支持联机事务处理。(OLTP)
3.Hive是基于Hadoop分布式文件系统的,它的数据存储在Hadoop分布式文件系统中。Hive本身是没有专门的数据存储格式。
Hive在加载数据的过程中不会对数据进行任何处理,甚至不会对数据进行扫描。
只需要在创建表的时候告诉Hive数据中的列分隔符和行分隔符,Hive就可以解析数据。
所以往Hive表里面导入数据只是简单的将数据移动/复制到表所在的目录中(LOAD方式或者HDFS PUT方式)。

二、HIVE数据类型
数值型:TINYINT(-128~127)、SMALLINT(-32,768~32,767)、INT、BIGINT、FLOAT、DOUBLE、DECIMAL
布尔型:BOOLEAN
字符串类型:String、VARCHAR(变长字符串序列)、CHAR(固定长度字符串序列)
日期类型:DATE(YYYY-MM-DD)、TIMESTAMPS(yyyy-MM-dd HH:mm:ss.fffffffff)
集合类型:STRUCT(结构体)、ARRAY(相同数据类型的集合)、MAP(键值对)

三、数据操作
1.数据导入示例
create table test3(
name string,
friends array<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'; 

--本地创建test3.txt, 
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

--数据导入三种方式:
--1.通过PUT HDFS目录的形式暴力导入(目录位置:hive-site.xml中hive.metastore.warehouse.dir属性)
hadoop fs -put test3.txt /home/hive/warehouse/uat.db/test3
--2.从本地LOAD操做是单纯的复制到hive表对应的位置、
load data local inpath '/opt/tmpData/test3.txt' overwrite into table test3;
--3.先手工移动到HDFS上,再通过LOAD操作移动到hive表对应的位置。
hadoop fs -put test3.txt /tmp
load data inpath '/tmp/test3.txt' overwrite into table test3;

--查询数据
select * from test3;
select friends[0] from test3; --数组可以通过下标访问
select children["xiao song"] from test3; --map通过[key]方式访问
select address.street from test3;        --类似于对象.属性的方式访问

2.外部表与内部表区别
(1)删除时,内部表(管理表)会将表的元数据及数据全部删除。而删除外部表,Hive仅仅删除外部表的元数据,数据是不会删除的
(2)内部表的数据通常是由HIVE自行管理(可通过location指定),数据会放在hive-site.xml中hive.metastore.warehouse.dir对应目录中。
而外部表的数据存放目录是在建表时自行定义,若未定义则按内部表的目录进行存放。
--创建表
create external table exter_table(
id int,
name string,
age int,
tel string)
row format delimited fields terminated by ','
location '/tmp/external';
--本地创建test.txt
1,wyp,25,13188888888888
2,test,30,13888888888888
3,zs,34,899314121
--将数据load到外部表中
load data local inpath '/home/tmp/test.txt' into table exter_table;
--删除表后,发现数据仍在
drop table exter_table;
dfs -ls /tmp/external/;
--通过alter命令将外部表调整为内部表,删除表后数据也没有了
alter table exter_table set tblproperties('EXTERNAL'='FALSE');
dfs -ls /tmp/external/;

3.分区表
Hive中的分区就是分目录。
--创建表
create table dept_partition(
deptno int, dname string, loc string
)
partitioned by (month string)
row format delimited fields terminated by '\t';
--本地新建文件dept.txt
10    ACCOUNTING    1700
20    RESEARCH    1800
30    SALES    1900
40    OPERATIONS    1700
--将数据插入到指定分区
load data local inpath '/home/tmp/dept.txt' into table dept_partition partition(month='201709');
load data local inpath '/home/tmp/dept.txt' into table dept_partition partition(month='201708');
--通过insert插入数据
insert into table dept_partition partition(month='201706') values(10,'anker',1555);
--查询数据,发现month是作为表的一个字段进行展示
select * from dept_partition where month='201709';
--增加分区(可指定具体目录)
alter table dept_partition add partition(month='201707') ;
alter table dept_partition add PARTITION(month='201706') location '/home/hive/warehouse/uat.db/dept_partition/201706';
--删除分区:
alter table dept_partition drop partition (month='201707');
--测试动态分区(Insert自动插入到相应的分区中,会自动新建目录)
--开启动态分区
set hive.exec.dynamic.partition = true;
set hive.exec.dynamic.partition.mode = nonstrict;
insert into table dept_partition partition(month)values(10,'anker',1555,'201612');
--创建临时表插入
create table dept(
deptno int, dname string, loc string,month string
)
row format delimited fields terminated by '\t';
insert into dept values(1,'A','B','201709');
insert into dept values(2,'C','D','201701');

insert into table dept_partition partition(month)
select deptno,dname,loc,month from dept;

5、分桶
分区针对的是数据的存储路径;分桶针对的是数据文件。主要用于数据采样。
create table stu_buck(id int, name string)
clustered by(id) into 4 buckets
row format delimited fields terminated by '\t';

dfs –ls查看表stu_buck存储文件,会发现分成了四份文件。

用抽样命令TABLESAMPLE(BUCKET x OUT OF y),例如对表格stu_buck从第一个桶开始抽取1个桶数据量的样本:

SELECT * FROM stu_buck TABLESAMPLE(BUCKET 1 OUT OF 4 ON id);

6、SerDe序列化与反序列化
SerDe 是两个单词的拼写 serialized(序列化) 和 deserialized(反序列化)。
当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以二进制序列的形式在网络上传送。
发送方需要把对象转化为字节序列才可在网络上传输,称为对象序列化;
接收方则需要把字节序列恢复为对象,称为对象的反序列化。
Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便的将数据加载到表中而不需要对数据进行转换,
这样在处理海量数据时可以节省大量的时间。
当向hdfs写数据的时候,先经过序列化,将数据转化成字节序列,然后以指定的格式(outputformat)输出到hdfs. 而从hdfs读数据时,则是一个相反的过程。
(1)上传JsonSerDe.jar
(2)vim test.json
{"name":"xiaogao","age":45}
(3)
hive> CREATE TABLE test1(name String,age String) row format serde 'org.openx.data.jsonserde.JsonSerDe' stored as textfile;
hive> load data local inpath "/home/bigdata/temp/test.json" into table test1;
hive> select * from test1;


四、常用命令
show tables;
--展示表的定义
show create table test;
--创建数据库
create database db_hive;
create database if not exists db_hive;
--创建一个数据库,指定数据库在HDFS上存放的位置
create database db_hive2 location '/db_hive2.db';
--删除数据库
drop database db_hive;
--删除数据库(不为空采用cascade级联删除)
drop database db_hive cascade;
--查询表的定义相关
desc formatted student2;
show create table student2;
--建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
[(col_name data_type [COMMENT col_comment], ...)]
[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]
[ROW FORMAT row_format]
[STORED AS file_format]
[LOCATION hdfs_path]
--hdfs目录查看
hdfs dfs -ls /home/hive/warehouse/uat.db/tb01
--hdfs数据查看
hdfs dfs -text /home/hive/warehouse/uat.db/tb01/  | more

四、文件存储格式
MR支持的压缩编码:Gzip、bzip2、LZO、Snappy; 常用的是Snappy(centos7自动支持,Centos6不支持需要自行安装)。
通过执行hadoop checknative可以检查支持压缩的类型。

(1)开启map输出阶段压缩可以减少job中map和Reduce task间数据传输量。
#开启hive中间传输数据压缩功能
hive (default)>set hive.exec.compress.intermediate=true;
#开启mapreduce中map输出压缩功能
hive (default)>set mapreduce.map.output.compress=true;
#设置mapreduce中map输出数据的压缩方式
hive (default)>set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;
#执行查询语句
hive (default)> select count(ename) name from emp;
(2)开启Reduce输出阶段压缩。
#开启hive最终输出数据压缩功能
hive (default)>set hive.exec.compress.output=true;
#开启mapreduce最终输出数据压缩
hive (default)>set mapreduce.output.fileoutputformat.compress=true;
#设置mapreduce最终数据输出压缩方式
hive (default)> set mapreduce.output.fileoutputformat.compress.codec =
 org.apache.hadoop.io.compress.SnappyCodec;
#设置mapreduce最终数据输出压缩为块压缩
hive (default)> set mapreduce.output.fileoutputformat.compress.type=BLOCK;
#测试一下输出结果是否是压缩文件
hive (default)> insert overwrite local directory
 '/opt/module/datas/distribute-result' select * from emp distribute by deptno sort by empno desc;

Hive支持的存储数的格式主要有:TEXTFILE、SEQUENCEFILE、ORC、PARQUET
TEXTFILE和SEQUENCEFILE的存储格式都是基于行存储的;
ORC和PARQUET是基于列式存储的。
行存储适合DML事务型处理,对指定列的统计分析,会把整张表读取到内存。
列存储对DML的事务处理I/O高、效率低,但非常适合于统计查询类操作,针对指定列只需将指定列
读取到内存进行操作。

TEXTFILE导入数据时会直接把数据文件拷贝到hdfs上不进行处理,sequencefile、rcfile、orcfile不能直接
从本地导入数据。

(1)TextFile
TextFile格式
默认格式,数据不做压缩,磁盘开销大,数据解析开销大。可结合Gzip、Bzip2、lzo压缩使用,但压缩后hive不会对数据进行切分,
从而无法对数据进行并行操作。
TextFile导入数据时会直接把数据文件拷贝到hdfs上不进行处理.
TextFile无法删除字段。

(2)SequenceFile
二进制文件,以<key,value>的形式序列化到文件中,SequenceFile是Hadoop API提供的一种二进制文件支持,
其具有使用方便、可分割、可压缩的特点。SequenceFile支持三种压缩选择:NONE,RECORD,BLOCK。
Record压缩率低,一般建议使用BLOCK压缩。
只能新增字段,无法删除字段。
(3)ORC
Orc(Optimized Row Columnar)
面向列的数据格式,先按照行组划分,再垂直划分的设计理念。
每个Orc文件由1个或多个stripe组成(stripe相当于RowGroup行组概念),每个stripe250MB大小,
每个Stripe里有三部分组成,分别是Index Data,Row Data,Stripe Footer。
Index Data:一个轻量级的index,默认是每隔1W行做一个索引。这里做的索引应该只是记录某行的各字段在Row Data中的offset。
Row Data:存的是具体的数据,先取部分行,然后对这些行按列进行存储。
Stripe Footer:存的是各个Stream的类型,长度等信息。
此存储格式的元数据采用protobuf存储,支持新增或删除字段。
(4)Parquet
是面向分析型业务的列式存储格式,以二进制方式存储的,是不可以直接读取的,因此Parquet格式文件是自解析的。
在存储Parquet数据的时候会按照Block大小设置行组的大小,由于一般情况下每一个Mapper任务处理数据的最小单位是一个Block,
这样可以把每一个行组由一个Mapper任务处理,增大任务执行并行度。
支持新增或删除字段。
(5)Avro
一种用于支持数据密集型的二进制文件格式。文件格式更为紧凑,若要读取大量数据时,Avro能够提供更好的序列化和反序列化
性能。
(6)自定义文件格式
通过集成InputFormat和OutputFormat来自定义文件格式。
CREATE TABLE base64example(line string)
STORED AS
inputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextInputFormat'
outputformat 'org.apache.hadoop.hive.contrib.fileformat.base64.Base64TextOutputFormat'

创建一个ORC+ZLIB压缩的表
CREATE TABLE log_orc_zlib
(...
...)
row format delimited fields terminted BY '\t'
stored AS orc
tblproperties("orc.compress"="ZLIB")

创建一个ORC+SNAPPY压缩的表
stored as orc tblproperties ("orc.compress"="SNAPPY");

在实际的项目开发当中,hive表的数据存储格式一般选择:orc或parquet。压缩方式一般选择snappy,lzo。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值