前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Apache Hive TM

Apache Hive TM

作者头像
DataScience
发布2019-12-30 17:29:56
1K0
发布2019-12-30 17:29:56
举报
文章被收录于专栏:A2DataA2Data

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,ClientWUI。其中最常用的是 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 基础操作

代码语言:javascript
复制
数据库
库选择: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 类型。

代码语言:javascript
复制
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 

删除表

代码语言:javascript
复制
hive> drop table userprofile;
OK
Time taken: 0.526 seconds

重新更改创建表导入数据(切记字段类型)

代码语言:javascript
复制
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)
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DataScience 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档