300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > 字段 新增hive_Hive分区表 | 每日五分钟学大数据

字段 新增hive_Hive分区表 | 每日五分钟学大数据

时间:2020-02-13 13:38:32

相关推荐

字段 新增hive_Hive分区表  | 每日五分钟学大数据

数据分区的一般概念存在已久。其可以有多种形式,但是通常使用分区来水平分散压力,将数据从物理上转移到和使用最频繁的用户更近的地方,以及实现其他目的。

Hive中有分区表的概念。我们可以看到分区表具有重要的性能优势,而且分区表还可以将数据以一种符合逻辑的方式进行组织,比如分层存储。

来看看这张分区表:

CREATE TABLE ods.ods_login(`uuid` string,`event` string,`time` string)partitioned by (dt string)

分区表改变了 Hive对数据存储的组织方式。如果我们是在ods库中创建的这个 表,那么对于这个表只会有一个ods_login目录与之对应:

hdfs://hadooopcluster/user/hive/warehouse/ods.db/ods_login

如果我们加一个分区

ALTER TABLE ods.ods_login add PARTITION (dt='-03-01');

那么存储路径会发生这样的变化

hdfs://hadoopcluster/user/hive/warehouse/ods.db/ods_login/dt=-03-01/

是的,分区名就是实际的目录名称。表下将会包含有零个文件或者多个文件,这些文件中存放着那些你新增的分区名称。

分区字段(这个例子中就是dt) 一旦创建好,表现得就和普通的字段一样。 事实上,除非需要优化查询性能,否则使用这些表的用户不需要关心这些“字段”是否是分区字段。

例如,下面这个查询语句将会查找出用户在-03-01的所有行为数据:

SELECT * FROM ods.ods_loginWHERE dt='-03-01'

需要注意的是,分区使这张表拥有了额外的一个时间字段,所以实际数据中可以省略类似含义的字段,避免冗余了。

对数据进行分区,最重要的原因就是为了更快地查询。在前面那个将结果范围限制在'-03-01'这一天的查询中,仅仅需要扫描一个目录下的内容即可。即使我们可能有好几百个目录,除了这一个目录其他的都可以忽略不计。对于非常大的数据集,分区可以显著地提高查询性能。

当我们在WHERE子句中增加谓词来按照分区值进行过滤时,这些谓词被称为分区过滤器。

为了避免查询的数据量太大,一个高度建议的安全措施就是将Hive 设置为“strict(严格)”模式,这样如果对分区表进行查询而WHERE子句没有加分区过滤的话,将会禁止提交这个任务。

用户也可以按照下面的语句将属性值设置为

hive> set hive.mapred.mode=strict;hive> SELECT * FROM ods.ods_login LIMIT 100;FAILED: Error in semantic analysis: No partition predicate found forAlias nen Table "ods.ods_login"

如果设置为nonstrict;则可以正常查询

hive> set hive.mapred.mode=nonstrict;hive> SELECT * FROM ods.ods_login LIMIT 100;aaa bbb ccc -03-01

同时,可以通过SHOW PARTITIONS命令查看表中存在的所有分区:

hive> SHOW PARTITIONS ods.ods_logindt=-03-01

参考资料:

1.《Hive编程指南》

2. Hive官方wiki:

/confluence/display/HIVE

>>想学大数据?点击找老蒙!<<智能人工推荐:

从面试官的角度谈谈大数据面试

你是否能被轻易地取代?

>> 点击查看更多觉得有价值请关注▼

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。