蜂巢怎么避免数据倾斜

  介绍

本篇内容介绍了“蜂巢怎么避免数据倾斜”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

<节> <节> <节> <节> <节>,,, ,

1。蜂巢中桶的概述

对于每一个表(表)或者分区,蜂巢可以进一步组织成桶,也就是说桶是更为细粒度的数据范围划分.Hive也是针对某一列进行桶的组织.Hive采用对列值哈希,然后除以桶的个数求余的方式决定该条记录存放在哪个桶当中。

把表(或者分区)组织成桶(Bucket)有两个理由:

,
(1)获得更高的查询处理效率。

桶为表加上了额外的结构,蜂巢在处理有些查询时能利用这个结构,具体而言,连接两个在(包含连接列的)相同列上划分了桶的表,可以使用地图端连接(Map-side联接)高效的实现。比如加入操作。对于加入操作两个表有一个相同的列,如果对这两个表都进行了桶操作。那么将保存相同列值的桶进行加入操作就可以,可以大大较少加入的数据量。

,
(2)使取样(抽样)更高效。

在处理大规模数据集时,在开发和修改查询的阶段,如果能在数据集的一小部分数据上试运行查询,会带来很多方便。

    <李> <节>创建带桶的表
 <代码> create  table  bucketed_user (id  int, name 字符串),clustered  by  (id), sorted 通过(名字),into  4, buckets  row  format  delimited  fields  terminated  by  & # 39; \ t # 39;, stored  as 文本文件;,
  ,

首先,我们来看如何告诉蜂巢——个表应该被划分成桶。我们使用集群由子句来指定划分桶所用的列和要划分的桶的个数:

 <代码> CREATE  TABLE  bucketed_user  (id  INT), name 字符串),

CLUSTERED  BY  (id), INTO  4,桶,,
  ,

在这里,我们使用用户ID来确定如何划分桶(蜂巢使用对值进行哈希并将结果除以桶的个数取余数。这样,任何一桶里都会有一个随机的用户集合(PS:其实也能说是随机,不是吗?)。

对于地图端连接的情况,两个表以相同方式划分桶。处理左边表内某个桶的mapper知道右边表内相匹配的行在对应的桶内,因此,映射器只需要获取那个桶(这只是右边表内存储数据的一小部分)即可进行连接。这一优化方法并不一定要求两个表必须桶的个数相同,两个表的桶个数是倍数关系也可以。用HiveQL对两个划分了桶的表进行连接,可参见“地图连接”部分(P400)。

桶中的数据可以根据一个或多个列另外进行排序。由于这样对每个桶的连接变成了高效的归并排序(合并排序),因此可以进一步提升地图端连接的效率。以下语法声明一个表使其使用排序桶:

 <代码> CREATE  TABLE  bucketed_users  (id , INT, name 字符串),

CLUSTERED  BY  (ID), SORTED  BY  (id  ASC), INTO  4,桶,,
  ,

我们如何保证表中的数据都划分成桶了呢?把在蜂巢外生成的数据加载到划分成桶的表中,当然是可以的。其实让蜂群来划分桶更容易。这一操作通常针对已有的表。

蜂巢并不检查数据文件中的桶是否和表定义中的桶一致(无论是对于桶的数量或用于划分桶的列)。如果两者不匹配,在査询时可能会碰到错误或未定义的结果,因此,建议让蜂群来进行划分桶的操作。

,

2.蜂巢中加入优化

,
mapside加入
    <李> <节>方法一:
 <代码> select /* +, MAPJOIN (time_dim), */, count(*),从

store_sales  join  time_dim 提醒(=ss_sold_time_sk  t_time_sk)
  ,
    <李> <节>方法二:这个可以由蜂巢自动进行地图端加入
 <代码> set  hive.auto.convert.join=true; 

select  count(*),从

store_sales  join  time_dim 提醒(=ss_sold_time_sk  t_time_sk)
  ,   ,
执行下面这段代码将会产生两个仅映射方法:
 <代码> select /* +, MAPJOIN (time_dim, date_dim), */, count(*),从

store_sales

join  time_dim 提醒(=ss_sold_time_sk  t_time_sk),

join  date_dim 提醒(=ss_sold_date_sk  d_date_sk)

蜂巢怎么避免数据倾斜