HIVE分区

来源:互联网 发布:内容来源于网络 编辑:程序博客网 时间:2024/04/28 18:01

hive分区

对数据进行分区,最重要的原因就是为了更快的查询,分区表改变了hive对数据存储的组织方式,当我们在where子句中增加谓词按照分区值进行过滤时,这些谓词被称为分区过滤器。1.如果表中的数据及分区非常大的话,执行一个包含所有分区的查询可能会触发一个巨大的Mapreduce任务。一个高度建议的安全措施就是将Hive设置为“strict”模式,这样如果对分区表进行查询而where子句没有加分区过滤的话,将会禁止提交这个任务。当然,也可以将其设置为“nonstrict”.
set hive.mapred.mode=strict
2.查看分区:show partitions tablename;3.如果表中有很多的分区,而我们只想查看是否存储某个特定分区键的分区的话,可以这样写:
show partitions employees partition(country='US')假设有两个分区,分区名称分别是country和state
4.describe extended employees命令也会显示出分区键5.外部表也可以使用分区,alter table 。。。add partiton 语句并非只有对外部表才能够使用。对于管理表,当有分区数据不是由load和insert语句产生时,就可以使用这个命令来指定分区路径。但是记住:并非所有的表数据都是放在通常的hive "warehouse"目录下的,同时删除管理表时,这些数据不会被连带删除掉。
1.创建分区alter table tablename add partition (year=2012,month=1,date=2) location 'hdfs://master_server/data/log_messages/2012/01/02'2.将分区下的数据拷贝到S3中,(关于S3和hdfs请看http://www.myexception.cn/vsts/1798848.html):hadoop distcp /data/log_message/2011/12/02 s3n: //ourbucket/logs/2011/12/023.修改表,将分区路径指定到S3路径:alter table log_messages partition(year=2011,month=12,day=2) set location 's3n://ourbucket/logs/2011/01/02';4.使用hadoop fs -rmr命令删除掉HDFS中的这个分区数据:hadoop fs -rmr /data/log_messages/2011/01/02

注意:hive不关心一个分区对应下的分区目录是否存在或者分区目录下是否有文件,不存在时,查询返回结果为空。

0 0