spark中多表连接优化实例

在Spark1.6.1和Hive1.2.1环境下处理大数据时,遇到一个reduce阶段耗时过长的问题。通过尝试开启Hive的数据倾斜优化、调整reduce数量和内存设置并未见效,反而出现内存超限错误。后来改用Spark执行,原SQL耗时2.3小时。通过优化表关联顺序,如先执行TST_ORDER_VEHICLE与TST_ORDER_RISK的关联,减少了stage数量和数据处理时间。进一步优化关联顺序,使得关键表TST_PC_ORDER的扫描与其他关联并行执行,将总耗时降低到25分钟。优化策略包括减少结果集大小、提升并行执行效率和调整关联顺序以优化关键路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境信息:
hive1.2.1
spark1.6.1
hadoop2.6.0-cdh5.4.2
memory:1918752, vCores:506

表结构:

表名称 表容量 主键 hive存储类型
temp_01_pc_order 5G PC_ORDER_ID RCFile
TST_ORDER_RISK 9.4G 非 PC_ORDER_ID RCFile
TST_ORDER_VEHICLE 36G PC_ORDER_VEHICLE_ID RCFile
TST_ORDER_ASSIST 800M 非ORDER_ID RCFile
TST_PC_ORDER 90G PC_ORDER_ID RCFile

原hive sql:
(为求简便,所有字段以XX代替,最终有90个字段)

INSERT OVERWRITE TABLE H_DW_ORDER
  SELECT A.PC_ORDER_ID, A.XX90
    FROM TST_PC_ORDER A
    LEFT JOIN (SELECT PC_ORDER_ID, XX
                 FROM (SELECT PC_ORDER_ID
                             ,XX
                             ,ROW_NUMBER() OVER(PARTITION BY PC_ORDER_ID ORDER BY UPDATED_DATE DESC) AS ROWNO
                         FROM TST_ORDER_RISK) K
                WHERE ROWNO = 1) B ON A.PC_ORDER_ID = B.PC_ORDER_ID
    LEFT JOIN TST_ORDER_VEHICLE C ON B.CLIENT_ID = C.PC_ORDER_VEHICLE_ID
    LEFT JOIN (SELECT T.* FROM TEMP_01_PC_ORDER T WHERE FLAG_L = 1) D ON A.PC_ORDER_ID =
                                                                         D.PC_ORDER_ID
    LEFT JOIN (SELECT T1.* FROM TEMP_01_PC_ORDER T1 WHERE FLAG_F = 1) F ON A.PC_ORDER_ID =
                                                                           F.PC_ORDER_ID
    LEFT JOIN (SELECT H.ORDER_ID, XX
                 FROM (SELECT E.XX
                             ,E.ORDER_ID
                             ,ROW_NUMBER() OVER(PARTITION BY
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值