我正在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_partitions和partitioned。执行日志为exe_log_no_partition和exe_log_partitioned。
谢谢。
添加
1,我看到EXPLAIN分区的结果,并认为mapper的数量是根据以下公式计算的:
(the table size 2619958583)/(mapreduce.input.fileinputformat.split.maxsize=256000000)
错了吗?