如何在Hive中通过分区产生效果

时间:2018-08-31 05:38:45

标签: hive mapreduce hadoop2

我正在MRv2上使用Hive,并且正在尝试优化Hive查询。

该数据库假定便利店的购买历史。该数据库包含6个表(客户(1M行),商店(1K行),员工(5K行),流派(30行),项目(3.5K行),purchase_histories(1G行)),并且我进行了查询以检索每件商品的购买数量,类型和客户性别的总和。

SELECT c.gender, 
       g.name, 
       i.name, 
       Sum(ph.num) 
FROM   purchase_histories ph 
       JOIN customers c 
         ON ( c.id = ph.cus_id 
              AND ph.dt < $var1
              AND ph.dt > $var2 ) 
       JOIN items i 
         ON ( i.id = ph.item_id ) 
       JOIN genres g 
         ON ( g.id = i.gen_id ) 
GROUP  BY c.gender, 
          g.name, 
          i.name; 

我对采购历史记录(dt),商品(gen_id)和客户(性别,byear)进行了分区。

我通过上述查询比较了该数据库,没有比较分区数据库(包含相同的表)。我在$ var1和$ var2中输入了一些值,以使purchase_histories的行的引用数变为10,000,000。

我测量了处理时间,发现没有分区数据库比另一个分区数据库要快(或相等)。我检查了执行日志,发现分区数据库的映射器数量约为10〜30,但未分区的数据库的映射器数量约为150。我认为许多映射器绝对不是很好,但是10〜30个映射器太小。所以我认为我必须检查一些有关映射号或内存大小的配置。但是我不知道要更改哪个配置,我的想法是正确的。

EXPLAIN的结果为no_partitionspartitioned。执行日志为exe_log_no_partitionexe_log_partitioned

谢谢。

添加

1,我看到EXPLAIN分区的结果,并认为mapper的数量是根据以下公式计算的:

(the table size 2619958583)/(mapreduce.input.fileinputformat.split.maxsize=256000000)

错了吗?

0 个答案:

没有答案