Optimization 配置单元连接查询优化
表格大小如下: A:100万 B:700k 考虑这个查询: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
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