hive数据库分桶表格的基本操作 分桶表 对比前面的分区表,分桶表是对数据进行更加细粒度的划分。分桶表将整个数据内容按照某列属性值的哈希值进行区分,使用该哈希值除以桶的个数得到取余数,余数决定了该条记录会被分在哪个桶中。余数相同的记录会分在一个桶里。需要注意的是,在物理结构上,一个桶对应一个文件,而分区表只是一个目录,至于目录下有多少数据是不确定的。 应用场景:数据抽样 在处理大规模数据集时,尤其载数据挖掘的阶段,可以用一份数据验证一下,代码是否可以运行成功,进行局部测试,也可以抽样进行一些代表性统计分析。 分桶抽样语句:select * from 分桶表 tablesample (bucket x out of y [on 列名]) 语句中的y,必须是表格分桶数量的倍数或者因子。 2.map-side join 可以获得更高的查询处理效率。桶为表加上了额外的结构,(利用原有字段进行分桶),Hive 在处理有些查询时能利用这个结构。具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用 Map 端连接 (Map-side join)高效的实现。比如join操作。对于join操作两个表有一个相同列,如果对这两个表都进行了桶操作,那么保存相同列值的桶进行join操作就可以,大大减少了join的数据量(只有当两张表分桶的数量呈倍数关系时才有效)。 创建分桶表的基本语法: create external table 表名 ( 列名 数据类型 ) clustered by (分桶字段) into x buckets row format delimited fields terminated by ‘列分隔符’ collection items terminated by ‘素分隔符’ map keys terminated by ‘键值对分隔符’; 我们来看看分桶表的创建过程和添加数据分桶的方法: 1.使用 load data 的方式进行分桶表格数据的导入: 先在hive里面准备一个分桶表格:
然后将数据load data到当前表格中:
这个时候我们再看看hdfs中的emp_clu的表格结构,数据被拆分成了四个部分进行保存:(这里要注意的是,在hive的3以上版本,load data会强制分桶的,但是在更早之前的版本则不会)
2.使用 insert 语句将其他表格数据导入分区表 我们有个普通的emp表格,现在将这个表格的数据导入到emp_clu中,并且实现分桶。 insert overwrite table 分桶表名 select * from 其他表 cluster by 分桶字段; insert overwrite table emp_clu select * from emp cluster by empno; Hive分桶的总结: 物理上每个桶就是目录里的一个文件,一个作业产生的桶(输出文件)数量和reduce任务个数相同。 而分区表的概念,分区代表了数据的仓库,也就是文件夹目录。每个文件夹下面可以放不同的数据文件。通过文件夹可以查询里面存放的文件。但文件夹本身和数据的内容毫无关系。 桶则是按照数据内容的某个值进行分桶,把一个大文件散列成为一个个小文件。 这些小文件可以单独排序。如果另外一个表也按照同样的规则分成了一个个小文件。两个表join的时候,就不必要扫描整个表,只需要匹配相同分桶的数据即可。效率可想而知,得到了极大的提升。 同样,对数据抽样的时候,也不需要扫描整个文件。只需要对每个分桶按照相同规则抽取一部分数据即可。 cluster by、distribute by、sort by 和 order by 的区别 这里有个 cluster by 的关键字,意思是按照某个列来分桶,并且默认在桶中对这个列的数据进行升序排序展示。 1.先看最熟悉的 order by order by是全局排序,写在select子句的最后面,有asc升序和desc降序两种方法,不管这个表格多大,在hive中都只使用一个reduce进行排序(将整个表格看成一个整体来排序),所以数据量大的时候排序的速度会比较慢。 2.cluster by 对字段进行分桶操作,并且对每个桶的该字段默认进行升序排序操作。 cluster by id 的效果,和 distribute by id sort by id asc 是一样的。 3.distribute by distribute by 采用哈希算法,将查询结果中哈希值相同的结果分发个对应的reduce使用,它必须写在 sort by 的前面。 4.sort by 这个每个mapreduce的内部排序,属于局部排序,对全局的表格而言其实不是排序,我们可以通过设置reduce的数量(set mapred.reduce.tasks)来决定查询的结果分桶数。 我们举个例子看一下: 首先设置reduce的数量为3: set mapred.reduce.tasks=3; 然后按部门分桶查询,在每个桶内按工资降序排序,因为distribute是按照哈希值来分发数据的,而我刚好是三个部门,所以相同的部门编号将被分发在一起: select * from emp distribute by deptno sort by sal desc; 这样我就实现了一个在每个桶的局部实现排序的方法。
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/60443.html