hive分区(hive分区表load数据)

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

本文目录一览:

hive分区的作用

Hive分区。

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

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

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

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

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

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

Hive:分区表表结构和数据复制

摘要: Hive , Shell

Hive复制表包括两种

对于非分区表如果要完全复制一张表到另一张表,直接使用CREATE TABLE ... AS语句即可,比如以下复制一个表的两个字段以及字段的值到另一个表

对于分区表如果使用CREATE TABLE ... AS语句则分区失效,但是可以执行不报错,且字段和数据都雹轮源能完全复制

以上有一张分区表,以dt字段作为分区,使用CREATE TABLE ... AS进行全表复制

检查表结构和表数据量都没有问题

检查分区,报错此表不是分区表,is not a partitioned table,但是在表结构中确实存在源态本来的分区字段dt,此时dt字段的分区功能失效,但是数据保留住了

分区表的全称复制且带有分区的操作方法需要使用 LIKE 语句复桐瞎制到分区信息,具体步骤如下

第一步复制得到一张空表,具有原表的表结构和分区信息

下一步使用hdfs命令操作将原表在hdfs的存储路径复制到新表的路径, 一张表的存储路径是一个目录,该目录下还存在子目录,每一个子目录代表一个分区,在分区目录下就是数据文件,数据文件是part开头格式,由Hive的分桶策略将同一分区下的数据进行划分

复制语句采用 * 通配符将原表目录下所有文件复制到新表路径下,查看新表的hdfs路径下数据文件

此时新表虽然对应数仓目录下有数据文件,但是在Hive客户端还是查不到数据为空表, 因为一个个数据分区不存在在新表的元数据中,数据是以分区目录为单位聚合的,新表目前查不到一个分区则自然查不到数据

下一步修复表的分区元数据,使用 MSCK REPAIR TABLE 命令

由输出的执行过程可见MSCK REPAIR TABLE命令先检查了表的分区信息是否存在在元数据,然后对不存在的分区信息进行修复,修复后该表即可正常使用

MSCK REPAIR TABLE 的作用是 只需要只用这一个命令就可以 快速 , 自动化 地添加(修复)全部分区 ,在Hive中如果先建分区表,并且以数据拷贝到对应HDFS目录这种方式作为初始化,需要手动添加分区才能使用,如果分区过多,使用 ALTER TABLE ADD PARTITION 极为不变,下面做一下测试看ALTER TABLE ADD PARTITION是否也能完成分区表的完全复制

下一步采用手动添加1个分区dt='20201209'

验证了手动分区能够完成, MSCK REPAIR TABLE只是自动化的扫描一遍数仓目录下的分区信息(dt='20201209' 到 dt='20210317') ,如果编写一个Shell脚本也能实现如下

运行这个Shell脚本后能达到同样的效果,但是这个脚本执行了15分钟,需要频繁启动和关闭Hive进程

[img]

什么是hive分区

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

在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方式加载数据

分区常用;分桶少用。

Hive分区的作用

如果没有分区的存在,那么每次查询Hive将会进行全表扫描。对于小数据量的表来说,全表扫描并不会慢到无法忍受,但是对于大数据量来讲,比如几年的数据,每次查询都要扫描几年的所有运旦数据,除了浪费时间之外,还浪费集群资源。为了改进这一问题,分区的价值就体现出来了。对于几年的数据,在设计Hive表的时候,可以将时间设计为分区字段,至于时间维度细到怎样的颗粒度,以业务需求为准。就这样,分区的存在,极大的缩小了数据的查询范围,比如以天为单位的分区字段,在查询2020年3月份的相关数据时,只需限制分区字段的时间在2020-03-01~2020-03-31之间,Hive就会根旁码扰据分区字段条件直接找到几年数据中归属2020年3月份的数据,然后在对2020年3月份的数据根据具体的逻辑进行处理即可,而不需要几年的数据全部都扫描一次。

区别:

1.静态分区是需要指定分区的(源数据中没有)

2.动态分区是利用数据中的字段坐分区的,(源数据中有的),

标签列表