Optimization 配置单元连接查询优化

Optimization 配置单元连接查询优化,optimization,hive,bigdata,query-optimization,hiveql,Optimization,Hive,Bigdata,Query Optimization,Hiveql,表格大小如下: A:100万 B:700k 考虑这个查询: Table A --------- col1, col2,Adate,qty Table B ------- col2,cost,Bdate 选择 A.col1, A.col2, B.B.B.B.B.B.B, 金额(数量)*收款单(成本)[0]价格 从 加入B 在(A.col2=B.col2和A.Adate上,我将尝试为您提供一些建议,以提高Hive中的查询性能 检查您正在使用的执行引擎 设置hive.execution.eng

表格大小如下:

A:100万 B:700k

考虑这个查询:

Table A
---------
col1, col2,Adate,qty

Table B
-------
col2,cost,Bdate
选择
A.col1,
A.col2,
B.B.B.B.B.B.B,
金额(数量)*收款单(成本)[0]价格
从
加入B

在(A.col2=B.col2和A.Adate上,我将尝试为您提供一些建议,以提高
Hive
中的查询性能

  • 检查您正在使用的执行引擎
设置hive.execution.engine;
如果您的执行引擎是mr,而不是
MapReduce
,则可以使用
ApacheSark
ApacheTez
,两者都比
MapReduce

设置hive.execution.engine=tez;
  • 连接查询在计算上很昂贵,而且速度可能很慢,特别是当您连接三个或更多表时,或者如果您使用的是非常大的数据
可以用来解决这个问题的一种策略是提前连接数据,并将预连接的结果存储在一个单独的表中,然后您可以查询该表。 这是对规范化数据库进行反规范化的一种方法,以使运行分析查询更容易。 这种预联接表的方法有一定的成本,但它可以使分析查询更容易编写,运行更快

还有一些其他技术可以提高
Hive
查询性能

  • 联接表排序(最后一个最大的表)
与任何类型的调优一样,了解系统的内部工作非常重要, 它需要选择哪个表是流式传输的,哪个表是缓存的。 Hive将JOIN语句中的最后一个表用于流式处理,因此我们需要确保此流式处理表在这两个表中是最大的

A:100万B:70万

因此,连接这两个表时,较大的表在查询中排在最后是很重要的

  • Bucketing将数据存储在单独的文件中,而不是像分区那样单独的子目录中
它以有效的随机方式分割数据,而不是像分区那样以可预测的方式。 将记录插入到带bucketing的表中时,Hive计算指定bucketing列中的值的哈希代码,并使用这些哈希代码将记录划分为Bucket。 出于这个原因,bucketing有时被称为hash分区。 bucketing的目标是将记录均匀地分布在预定义数量的Bucket上。 如果所有联接的表都在联接键列上扣接,则扣接可以提高联接的性能

有关扣合的更多信息,请参阅描述扣合表格的
Hive
语言手册的页面

分区

  • 分区是根据日期、城市和部门等特定列的值将表划分为相关部分的一种方法
配置单元中的每个表都可以有一个或多个分区键来标识特定分区。 使用分区可以很容易地对数据片段进行查询

使用Tez和mapjoin

SELECT 
  A.col1,
  A.col2,
  B.Bdate bdate,
  SUM(qty)*COLLECT_LIST(cost)[0] price 
FROM A 
JOIN B 
ON (A.col2 = B.col2 AND A.Adate <= B.Bdate) 
GROUP BY 
  A.col1,
  A.col2,
  B.bdate;
此外,此计算不具有内存效率:

set hive.auto.convert.join=true; --this enables map-join
set hive.mapjoin.smalltable.filesize=25000000; --adjust for your smaller table to fit in memory
set hive.execution.engine=tez;

COLLECT\u LIST
将组中的所有成本值收集到非唯一(包含组中所有行的值)和无序(无序,因为在COLLECT\u LIST之前没有任何分发+排序)数组中。此数组可以足够大(元素数=组中的行数),根据您的数据,然后您选择[0]元素,这意味着您正在从组中选择任何随机成本。收集数组以获得任何随机元素是否有意义?使用
min()
max
相反。如果应该采用哪种
成本
无关紧要,那么
min(成本)
max(成本)
或其他一些标量函数将消耗更少的内存。您可以使用第一个\u值分析函数(可能需要子查询,但也会节省内存)

我在公共属性col2上对表A和表B进行了调整。表B小得多,我将set hive.mapjoin.smalltable.filesize增加到表B的1.5倍,并改用mapjoin。在3000个映射任务中,有2个每次都失败,并且我无法获得连接结果。请退出(和A.Adate add explain plan PLease配置单元执行引擎是TEZ。此外,我从select子句中删除了SUM(qty)*COLLET_LIST(cost)[0]价格。@如果您的数据在col2、date、COGRAMETER中包含重复项,也可以使用user1808266。
SUM(qty)*COLLECT_LIST(cost)[0] price