Apache Hive TM
(数据仓库工具)
Apache Hive™数据仓库软件有助于使用SQL读取,编写和管理驻留在分布式存储中的大型数据集。可以将结构投影到已存储的数据中。提供了命令行工具和JDBC驱动程序以将用户连接到Hive。
Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供简单的sql查询功能,可以将sql语句转换为MapReduce任务进行运行。
其优点是学习成本低,可以通过类SQL语句快速实现简单的MapReduce统计,不必开发专门的MapReduce应用,十分适合数据仓库的统计分析。
Hive是建立在 Hadoop 上的数据仓库基础构架。它提供了一系列的工具,可以用来进行数据提取转化加载(ETL),这是一种可以存储、查询和分析存储在 Hadoop 中的大规模数据的机制。Hive 定义了简单的类 SQL 查询语言,称为 HQL,它允许熟悉 SQL 的用户查询数据。
Apache
设计特征
⊙Hive 是一种底层封装了Hadoop 的数据仓库处理工具,使用类SQL 的HiveQL 语言实现数据查询,所有Hive 的数据都存储在Hadoop 兼容的文件系统(例如,Amazon S3、HDFS)中。
Hive 的设计特点如下。
⊙● 支持创建索引,优化数据查询。
⊙● 不同的存储类型,例如,纯文本文件、HBase 中的文件。
⊙● 将元数据保存在关系数据库中,大大减少了在查询过程中执行语义检查的时间。
⊙● 可以直接使用存储在Hadoop 文件系统中的数据。
● 内置大量用户函数UDF 来操作时间、字符串和其他的数据挖掘工具,支持用户扩展UDF 函数来完成内置函数无法实现的操作
● 类SQL 的查询方式,将SQL 查询转换为MapReduce 的job 在Hadoop集群上执行
体系结构
Architecyure
主要分为以下几个部分:
用户接口
用户接口主要有三个:CLI,Client 和 WUI。其中最常用的是 CLI,Cli 启动的时候,会同时启动一个 Hive 副本。Client 是 Hive 的客户端,用户连接至 Hive Server。在启动 Client 模式的时候,需要指出 Hive Server 所在节点,并且在该节点启动 Hive Server。 WUI 是通过浏览器访问 Hive。
元数据存储
Hive 将元数据存储在数据库中,如 mysql、derby。Hive 中的元数据包括表的名字,表的列和分区及其属性,表的属性(是否为外部表等),表的数据所在目录等。解释器、编译器、优化器、执行器、解释器、编译器、优化器完成 HQL 查询语句从词法分析、语法分析、编译、优化以及查询计划的生成。生成的查询计划存储在 HDFS 中,并在随后由 MapReduce 调用执行。
Hadoop
Hive 的数据存储在 HDFS 中,大部分的查询由 MapReduce 完成(不包含 * 的查询,比如 select * from tbl 不会生成 MapReduce 任务)。
数据存储
首先,Hive 没有专门的数据存储格式,也没有为数据建立索引,用户可以非常自由的组织 Hive 中的表,只需要在创建表的时候告诉 Hive 数据中的列分隔符和行分隔符,Hive 就可以解析数据。
其次,Hive 中所有的数据都存储在 HDFS 中,Hive 中包含以下数据模型:表(Table),外部表(External Table),分区(Partition),桶(Bucket)。
Hive 中的 Table 和数据库中的 Table 在概念上是类似的,每一个 Table 在 Hive 中都有一个相应的目录存储数据。
例如,一个表 A2Data,它在 HDFS 中的路径为:/A2Data/aa,其中,A2Data是在 hive-site.xml 中由 ${hive.metastore.warehouse.dir} 指定的数据仓库的目录,所有的 Table 数据(不包括 External Table)都保存在这个目录中。
Partition 对应于数据库中的 Partition 列的密集索引,但是 Hive 中 Partition 的组织方式和数据库中的很不相同。在 Hive 中,表中的一个 Partition 对应于表下的一个目录,所有的 Partition 的数据都存储在对应的目录中。
例如:A2Data表中包含 pday和 phour两个 Partition,
则对应于
pday= 20190501,
phour= US 的 HDFS 子目录为:/A2Data/aa/pday=201905011/phour=21;
对应于
pday= 20190501, phour= 21的 HDFS 子目录为;
/a2data/aa/pday=20190501/phour=21
Buckets 对指定列计算 hash,根据 hash 值切分数据,目的是为了并行,每一个 Bucket 对应一个文件。
External Table 指向已经在 HDFS 中存在的数据,可以创建 Partition。它和 Table 在元数据的组织上是相同的,而实际数据的存储则有较大的差异。
Table 的创建过程和数据加载过程(这两个过程可以在同一个语句中完成),在加载数据的过程中,实际数据会被移动到数据仓库目录中;之后对数据对访问将会直接在数据仓库目录中完成。删除表时,表中的数据和元数据将会被同时删除。
External Table 只有一个过程,加载数据和创建表同时完成(CREATE EXTERNAL TABLE ……LOCATION),实际数据是存储在 LOCATION 后面指定的 HDFS 路径中,并不会移动到数据仓库目录中。当删除一个 External Table 时,仅删除元数据,表中的数据不会真正被删除。
优化方法
优化方法编辑
1、join连接时的优化:当三个或多个以上的表进行join操作时,如果每个on使用相同的字段连接时只会产生一个mapreduce。
2、join连接时的优化:当多个表进行查询时,从左到右表的大小顺序应该是从小到大。原因:hive在对每行记录操作时会把其他表先缓存起来,直到扫描最后的表进行计算
3、在where字句中增加分区过滤器。
4、当可以使用left semi join 语法时不要使用inner join,前者效率更高。原因:对于左表中指定的一条记录,一旦在右表中找到立即停止扫描。
5、如果所有表中有一张表足够小,则可置于内存中,这样在和其他表进行连接的时候就能完成匹配,省略掉reduce过程。
设置属性即可实现,set hive.auto.covert.join=true;
用户可以配置希望被优化的小表的大小 set hive.mapjoin.smalltable.size=2500000;
如果需要使用这两个配置可置入$HOME/.hiverc文件中。
6、同一种数据的多种处理:从一个数据源产生的多个数据聚合,无需每次聚合都需要重新扫描一次。
7、limit调优:limit语句通常是执行整个语句后返回部分结果。
set hive.limit.optimize.enable=true;
8、开启并发执行。某个job任务中可能包含众多的阶段,其中某些阶段没有依赖关系可以并发执行,开启并发执行后job任务可以更快的完成。
设置属性:set hive.exec.parallel=true;
9、hive提供的严格模式,禁止3种情况下的查询模式。
a:当表为分区表时,where字句后没有分区字段和限制时,不允许执行。
b:当使用order by语句时,必须使用limit字段,因为order by 只会产生一个reduce任务。
c:限制笛卡尔积的查询。
10、合理的设置map和reduce数量。
11、jvm重用。可在hadoop的mapred-site.xml中设置jvm被重用的次数。
Apache Hive 基础操作
数据库
库选择:use 库名;
创建数据库:create basedata 库名;
删除数据库:drop basedata 库名; #注意库中没有表或者无数据才可以删除!
hive 暂不支持数据库重命名操作。
1.用户可以使用 ALTER DATABASE 命令来为某个数据库的
DBPROPERTIES设置键-值对属性值,来描述这个数据库的属性信息。
EG:
ALTER (DATABASE|SCHEMA) database_name SET DBPROPERTIES (property_name=property_value, ...);
2. 也可以使用该命令修改数据库的用户或权限;
ALTER (DATABASE|SCHEMA) database_name SET OWNER [USER|ROLE] user_or_role;
3.但是数据库的其他元数据信息都是不可以更改的,包括数据库名和数据库所在的目录位置。
2)查看库下面的表:show tables;
具体表字段:desc 表名;
具体表信息:desc formatted 表名;
(此处可以左右滑动哦)
首先创建一个表
vim User.txt
数据转换
很多情况不允许直接存id 的,我们对第一列 进行MD5加密 (用法)
python md5.py inputfile colnum > outputfile
[root@Master Aidata]# python md5.py user.txt 1 >id.txt
[root@Master Aidata]# cat id.txt
A 18 7fc56270e7a70fa81a5935b72eacbe29
B 15 9d5ed678fe57bcca610140957afab571
C 16 0d61f8370cad1d412f80b84d143e1257
D 21 f623e75af30e62bbd73d6df5b50bb7b5
E 22 3a3ea00cfc35332cedf6e5e9a32e94da
创建一个Aidata 数据库 & Hive 表(普通表)
hive> show databases;
OK
default
Time taken: 0.023 seconds, Fetched: 1 row(s)
hive> create database aidata;
OK
Time taken: 0.576 seconds
hive> use aidata;
OK
Time taken: 0.105 seconds
创建hive 表
hive> create table userprofile (id int, age int, user_id string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
数据源:
[root@Master Aidata]# pwd
/root/Aidata
[root@Master Aidata]# cat id.txt
A 18 7fc56270e7a70fa81a5935b72eacbe29
B 15 9d5ed678fe57bcca610140957afab571
C 16 0d61f8370cad1d412f80b84d143e1257
D 21 f623e75af30e62bbd73d6df5b50bb7b5
E 22 3a3ea00cfc35332cedf6e5e9a32e94da
导入数据:
hive> load data local inpath '/root/Aidata/id.txt' into table
> userprofile;
Loading data to table aidata.userprofile
Table aidata.userprofile stats: [numFiles=1, numRows=0, totalSize=190, rawDataSize=0]
OK
Time taken: 0.868 seconds
查询表数据:
hive> select * from userprofile;
OK
NULL 18 7fc56270e7a70fa81a5935b72eacbe29
NULL 15 9d5ed678fe57bcca610140957afab571
NULL 16 0d61f8370cad1d412f80b84d143e1257
NULL 21 f623e75af30e62bbd73d6df5b50bb7b5
NULL 22 3a3ea00cfc35332cedf6e5e9a32e94da
Time taken: 0.652 seconds, Fetched: 5 row(s)
咦,怎么第一列木有了呢?
原因呢?就是我们建表的时候不小心将表中的字段类型写错。 不是还有骚操作吗?
But,Hive 中不支持Int 转化String 类型。
hive> select (cast(cast(id as int) as string)) from userprofile;
OK
NULL
NULL
NULL
NULL
NULL
Time taken: 0.125 seconds, Fetched: 5 row(s)
hive> desc userprofile;
OK
id int
age int
user_id string
删除表
hive> drop table userprofile;
OK
Time taken: 0.526 seconds
重新更改创建表导入数据(切记字段类型)
hive> create table userprofile (id string, age int, user_id string)
> ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t'
> STORED AS TEXTFILE;
OK
Time taken: 0.23 seconds
hive> load data local inpath '/root/Aidata/id.txt' into table
> userprofile;
Loading data to table aidata.userprofile
Table aidata.userprofile stats: [numFiles=1, numRows=0, totalSize=190, rawDataSize=0]
OK
Time taken: 0.412 seconds
hive> select * from userprofile;
OK
A 18 7fc56270e7a70fa81a5935b72eacbe29
B 15 9d5ed678fe57bcca610140957afab571
C 16 0d61f8370cad1d412f80b84d143e1257
D 21 f623e75af30e62bbd73d6df5b50bb7b5
E 22 3a3ea00cfc35332cedf6e5e9a32e94da
Time taken: 0.13 seconds, Fetched: 5 row(s)