hive分区(hive分区和分桶)

本篇文章给大家谈谈hive分区,以及hive分区和分桶对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。

本文目录一览:

在Hive中如何实现数据分区

一、Hive only:加载分区数据的快捷方法

如果指定的分区不存在Hive将创建新的分区

这个命令将:

(1)如果不存在的话添加分区到表的元数据

(2)如果存在的话,创建子目录:/user/hive/warehouse/call_logs/call_date=2014-10-02

(3)移动消拿HDFS文件call-20141002.log到分区子目录

二、查看、添加和移除分区

(1)查看当前表逗郑分区

(2)使用ALTER TABLE添加或删除分区

三、  从已存在的分区目录创建分区

(1)HDFS的分区目录可以在Hive或Impala之外进行创建和数据,比如:通过Spark或MapReduce应用

(2) Hive中使用MSCK REPAIR TABLE命令来为已存在的表创建分区

四、什么时候使用分区

下列情况使用分区

(1)读取整个数据集需要花费很长时间

(2)查询几乎只对分区字段进行过滤

(3)分区列有合理数量的不同的值

(4)数据生成或ETL过程是按文件或目录名来分段数据的

(5)分区列值不在数据本身

五、什么时候不使用分区

(1)避免把数据分区到很多小数据文件

– 不要对有太多惟一值的列进行分区

(2)注意:当使用动态分区时容易发生

– 比如:按照fname来分区客户表会产生上千个分区

六、  Hive进行分区

在旧的Hive版本中,动态分区默认没有启用 ,通过设置这两个属性启用:

但是在hive分区中我们应该注意一些问题,比如:

(1)注意:Beeline设置的Hive变量只在当前会话有效,系统管理员可以设置永久生效

(2)注意:如果分区列有很多唯一值,将会创建很多分区

另外,我们可以给Hive配置参数来限制分区数 :

(1) hive.exec.max.dynamic.partitions.pernode

查询在某个节点上可以创建的最大动态分区数,默认100

(2) hive.exec.max.dynamic.partitions

一个HiveQL语句可以创建的最大动态分区数拿指搭 ,默认1000

(3)hive.exec.max.created.files

一个查询总共可以创建的最大动态分区数,默认1000000

Hive分区参考

hive 为了避免全表查询,从而旁灶引进分区,将数据按目录进行划分,减少不必要的查询,从而提高效率

mysql的分区字段用的是表内字段,hive的分区字段采用表外字段,也就是使用伪字段,分区字段在创建表的时候指定

hive.exec.dynamic.partition=true; 是否允许动态分区

hive.exec.dynamic.partition.mode=strict/nostrict; 动态区模式为严格模式

hive.exec.max.dynamic.partitions=1000; 允许最大的动态分区

hive.exec.max.dynamic.partitions.pernode=100; 单个节点允许最大分区

strict:严格模式,最少需要一个静态分区列亏启腊(指定固定值)

nostrict:费严格模式,允许所有的分区字段都为动态。

hive的静态分区:分区数据已知

hive的动态分区:分区数据未知(不知道有多少个分区)

hive的混合分区:有动态有静态

分区使用表外的字段,分桶使用表内字段

分区销滑可以使用load加载数据,而分桶就必须要使用insert into方式加载数据

分区常用;分桶少用。

[img]

什么是hive分区

Hive的分区方式:由于Hive实际是存储在HDFS上的抽象,Hive的一个分区名对应一个目录名,子分区名就是子目录名,并不是一个实际字段。按照数据表的某列或某穗悔些列分为多个区,区族明从猜穗正形式上是文件夹(HDFS里的文件夹)

hive分区的作用

Hive分区。

     是指按照数据表的某列或某些列分为多个区,区从形式上可以理解为文件夹,比如我们要收集某个大型网站的日志数据,一个肢核网站每天的日志数据存在同一张表上,由于每天会生成大量的日志,导致数据表的内容巨大,在查询时进行全表扫描耗费的资源非常多。那其实这个情况下,我们可以按照日期对数据表进行分区,不同日期的数据存放在不同的分区,在查询时只要指定分区字段的值就可以直接从该分区查找。

下面从用shell命令操作分区表和从hdfs文件系统查看分区表相结合的方式加深对分区表的认识。

第一,创建分区表并将本地文件中的数据加载到分区表中。

要注意的是:首先,创建分区表的时候,要通过关键字 partitioned by (name  string)声明该表是分区表,并且是按照字段name进行分区,name值一致的所有记录存放在一个分区中,分区属性name的类型是string类型。当然,可以依据多个列进行分区,即对某个分区的数据按照某些列继续分区。

其次,向分区表导入数据的时候,要通过关键字partition(name=“jack”)显示声明数据闭饥缓要导入到表的哪个分区,这里表示要将数据导入到分区为name=jack的分区。

再次,这里要重点强调,所谓分区,这是将满足某些条件的记录打包,做个记号,在查询时提高效率,相当于按文件夹对文件进行分类,文件夹名可类比分区字段。这个分区字段形式上存在于数据表中,在查询时会显示到客户端上,但并不真正在存储在数据表文件中,是所轿模谓伪列。所以,千万不要以为是对属性表中真正存在的列按照属性值的异同进行分区。比如上面的分区依据的列name并不真正的存在于数据表中,是我们为了方便管理添加的一个伪列,这个列的值也是我们人为规定的,不是从数据表中读取之后根据值的不同将其分区。我们并不能按照某个数据表中真实存在的列,如userid来分区

关于hive分区和hive分区和分桶的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。

标签列表