首页 > 数据库技术 > 详细

hive与mysql的数据分区的异同

时间:2015-03-26 09:20:01      阅读:330      评论:0      收藏:0      [点我收藏+]
  1. 数据分区是什么?

    数据库分区是一种物理数据库设计技术,DBA和数据库建模人员对其相当熟悉。

    分区把一大块数据分成了n小块,这样查询的时候很快定位到某一小块上,在小块中寻址要快很多;

  2. 多大的数据量才需要分区?

    参考标准,如果一张表的记录超过在超过1000w,并以每月百万的数据量增长,那需要分区。

  3. 为什么需要数据分区?

    性能提升;方便管理;避免数据倾斜

    改善数据库的结构有两种,一种是采用存储过程代替普通的SQL语句,

    另外一种就是使用数据库系统中增强索引和规划分区表进行优化,

    数据分区主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。

  4. 有几种常见的数据分区?各自的优缺点 (基于mysql)

    行分区 ----按日期的分区

    列分区--- 参数值个数比较少 国际化按国家的分区

    range分区:行数据基于属于一个给定连续区间的列值被放入分区,mysql5.5开始支持range columns的分区。

    list分区:分区面向的是离散的值,mysql5.5支持list columns。

    hash分区:根据用户自定义的表达式的返回值来进行分区,返回值不能为负数。

    key分区:根据MYSQL数据库提供的哈希函数来进行分区。

    谨记:无论使用何种类型的分区,分区总是在创建时就自动的顺序编号,且从0开始记录;

      只有RANGE和LIST支持子分区,但是子分区内只能使用HASH和KEY分区。

5.hive分区

   因为分区列的值要转化为文件夹的存储路径,

在表的数据文件中实际上并不保存分区列的信息与数据。

数据是根据文件夹的名字读取来的,而不是实际从数据文件中读取来的。

一般向分区表中插入数据时系统会校验数据是否符合该分区,如果不符合会报错。

而在hive中,向某个分区中插入什么样的数据完全是由人来控制的。

动态分区可以根据查询得到的数据自动匹配到相应的分区中去。

先设置hive.exec.dynamic.partition参数值为true,默认值为false,即不允许使用:

如果源数据对应的province子分区不存在,则会自动创建,非常方便,

而且避免了人工控制插入数据与分区的映射关系存在的潜在风险。

为了让分区列的值相同的数据尽量在同一个mapreduce中,

这样每一个mapreduce可以尽量少的产生新的文件夹,

可以借助distribute by的功能,将分区列值相同的数据放到一起.

附distributed by 

  ditribute by是控制map的输出在reducer是如何划分的,举个例子,我们有一张表,mid是指这个store所属的商户,money是这个商户的盈利,name是这个store的名字

store: 

midmoneyname

AA15.0商店1

AA20.0商店2

BB22.0商店3

CC44.0商店4

    执行hive语句:

select mid, money, name from store distribute by mid sort by mid asc, money asc  

 我们所有的mid相同的数据会被送到同一个reducer去处理,这就是因为指定了distribute by mid,这样的话就可以统计出每个商户中各个商店盈利的排序了(这个肯定是全局有序的,因为相同的商户会放到同一个reducer去处理)。这里需要注意的是distribute by必须要写在sort by之前。





hive与mysql的数据分区的异同

原文:http://my.oschina.net/u/1782622/blog/391853

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!