实际应用中,hive里面的分区表和分桶表一般用于什么场景呢? 相同点:分区表和分桶都能将参与计算的数据限定在一个范围内,hive 上分区是以目录的形式存在,分桶则是以不同文件的形式存在。从存储形式所在的层级上来看,这两者并不冲突。 在实际场景中,数仓事实表中的数据通常有事件发生的时间,比如可以将数据以天作为分区存储,如果只关心前一天/ 最近一段时间的数据,数据查询时就可以只扫描对应的分区。 分桶则是用在一个没有自然分区属性的字段上,比如说用户的id,有可能是一个随机值或者是个字符串。假设两张表以用户 id 为 join key 做一次 join 就需要在全量用户信息上做 join,join build 就需要比较大的内存。如果首先将 left 和 right 的数据都按照同样的值进行 hash 后取模,也就是说同一个 user 的数据在left 和 right 表都存在相同 bucket id 的分桶中。在具体引擎做计算的时候,就可以一个分桶一个分桶的做,需要的内存就会少很多。 分区表 分区表的基本操作 分区表实际上就是对应一个 HDFS 文件系统上的独立的文件夹,该文件夹下是该分区所 有的数据文件。Hive 中的分区就是分目录,把一个大的数据集根据业务需要分割成小的数据 集。在查询时通过 WHERE 子句中的表达式选择查询所需要的指定的分区,这样的查询效率 会提高很多。 1)创建分区表语法: 注意:分区字段不能是表中已经存在的数据,可以将分区字段看作表的伪列。 2)加载数据到分区表中 1.数据准备 2.加载数据 注意:分区表加载数据时,必须指定分区 4)查询分区表中数据 单分区查询 多分区联合查询 5)增加分区 创建单个分区 同时创建多个分区 6)删除分区 删除单个分区 同时删除多个分区 7)查看分区表有多少分区 8)查看分区表结构 二级分区 1)创建二级分区表 2)正常的加载数据 (1)加载数据到二级分区表中 (2)查询分区数据 3)把数据直接上传到分区目录上,让分区表和数据产生关联的三种方式 (1)方式一:上传数据后修复 上传数据 查询数据(查询不到刚上传的数据) 执行修复命令 (2)方式二:上传数据后添加分区 上传数据 执行添加分区 (3)方式三:创建文件夹后 load 数据到分区 创建目录 上传数据 动态分区参数设置 关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据 插入到相应的分区中,Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),只不过, 使用 Hive 的动态分区,需要进行相应的配置。 (1)开启动态分区功能(默认 true,开启) (2)设置为非严格模式(动态分区的模式,默认 strict,表示必须指定至少一个分区为 静态分区,nonstrict 模式表示允许所有的分区字段都可以使用动态分区。) (3)在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000 (4)在每个执行 MR 的节点上,最大可以创建多少个动态分区。该参数需要根据实际 的数据来设定。比如:源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就 需要设置成大于 365,如果使用默认值 100,则会报错。 (5)整个 MR Job 中,最大可以创建多少个 HDFS 文件。默认 (6)当有空分区生成时,是否抛出异常。一般不需要设置。默认 false 分桶表 分区提供一个隔离数据和优化查询的便利方式。不过,并非所有的数据集都可形成合理 的分区。对于一张表或者分区,Hive 可以进一步组织成桶,也就是更为细粒度的数据范围 划分。 1)先创建分桶表 (1)数据准备 (2)创建分桶表 (3)查看表结构 (4)导入数据到分桶表中,load 的方式 (5)分桶规则: Hive 的分桶采用对分桶字段的值进行哈希,然后除以桶的个数求余的方 式决定该条记录存放在哪个桶当中 2)分桶表操作需要注意的事项 (1)reduce 的个数设置为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个 数设置为大于等于分桶表的桶数 (2)从 hdfs 中 load 数据到分桶表中,避免本地文件找不到问题 (3)不要使用本地模式 3)insert 方式将数据导入分桶表 先创立好一个stu_insert表; 导入数据 插入 抽样查询 对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结 果。Hive 可以通过对表进行抽样来满足这个需求。 语法: TABLESAMPLE(BUCKET x OUT OF y) x小于等于y 原文链接:Hive之分区和分桶 分区 分区可以提高查询效率,实际上 hive 的一个分区就是 HDFS 上的一个目录,目录里放着属于该分区的数据文件。 分区的基本操作 创建分区表 *分区字段不能是表中字段 创建完分区表如果需要将数据导入表中,需要用 load 命令导入; 如果是在 HDFS 中创建目录并将数据文件传到目录中,是没办法查到的,因为查询分区表是需要查询数据的; 如果非要用这种方法或者已经做了,可以执行修复命令: 查看分区 查询 添加分区 删除分区 二级分区 二级分区相当于在一级分区对应的目录上新增一个目录,一般用于单个分区数据量很大,需要做拆解的情况。 创建二级分区表 二级分区表的其它操作与一级的区别不大,因此不做过多的描写。 动态分区 关系型数据库中,对分区表 Insert 数据时候,数据库自动会根据分区字段的值,将数据插入到相应的分区中 Hive 中也提供了类似的机制,即动态分区(Dynamic Partition),不过使用 Hive 的动态分区需要进行相应的配置。 开启动态分区功能(默认 true,开启) 设置为非严格模式 默认 strict,表示至少指定一个分区为静态分区,nonstrict 表示允许所有的分区字段都能使用动态分区。 在所有执行 MR 的节点上,最大一共可以创建多少个动态分区。默认 1000 在每个执行 MR 的节点上,最大可以创建多少个动态分区。比如源数据中包含了一年的数据,即 day 字段有 365 个值,那么该参数就 需要设置成大于 365,如果使用默认值 100,则会报错。 动态插入数据到分区 分桶 分区提高了数据的查询效率,同时还能将数据隔离开,但是并非所有数据能形成合理的分区。 hive可以将数据进行分桶,不同于分区是针对存储路径进行分类,分桶是在数据文件中对数据进行划分的一种技术。 分桶是指定某一列,让该列数据按照哈希取模的方式随机、均匀的分发到各个桶文件中。 创建分桶表 加载数据 加载数据到分桶表中可以使用 load 或者 insert 的方式。 需要注意的是,reduce 的个数设置应该为-1,让 Job 自行决定需要用多少个 reduce 或者将 reduce 的个 数设置为大于等于分桶表的桶数。 抽样 对于非常大的数据集,有时用户需要使用的是一个具有代表性的查询结果而不是全部结 果。Hive 可以通过对表进行抽样来满足这个需求。 语法:tablesample(bucket x out of y) y必须是table总共bucket数的倍数或者因子。 上面的语句表示:对于分桶数为 6 的表,总共抽取 6/y = 6/3 = 2 个bucket的数据, 分别为第 x=1 个 bucket 和第 x+3=4 个 bucket 的数据。 小结 本文简单介绍了 hive 的分区,包括如何创建分区表、新建分区和删除分区,还有二级分区和动态分区;以及分桶表,包括分桶表的概念和抽样函数。 “大数据的奇妙冒险”提示您:持续不迷路,转载请注明出处 01 分区表的概念 当Hive表对应的数据量大、文件多时,为了避免查询时全表扫描数据,Hive支持根据用户指定的字段进行分区,分区的字段可以是日期、地域、种类等具有标识意义的字段。比如把一整年的数据根据月份划分12个月(12个分区),后续就可以查询指定月份分区的数据,尽可能避免了全表扫描查询。


2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/70417.html
