You need to enable JavaScript to run this app. Hive SQL中UNION ALL查询结果后执行JOIN关联的语法问题
优惠活动
大模型
产品
解决方案
定价
更多

Hive SQL中UNION ALL查询结果后执行JOIN关联的语法问题

Hive两段查询关联实现方案

你可以通过以下两种常用方式实现关联,均兼容Hive语法:

方案1:CTE写法(推荐,可读性高,Hive 0.13+支持)

source  /s/mysdrive/6298.hql;
set hivevar:selected_month= "2021-01";
set hivevar:selected_day=TO_DATE("2021-01-01");

WITH travel_data AS (
    -- 第一段三地行驶数据UNION ALL查询
    SELECT CANADA.car_id,
    "CANADA" as Source,
    CANADA.tire_type,               
    CANADA.km_traveled,         
    CANADA.outside_temp,    
    CANADA.cabin_temp,                      
    CANADA.lights_on
    FROM ctbls.can_data_na CANADA
    WHERE CANADA.car_id in (${ID_LIST}) and CANADA.cvdc62_partition_month_x >= ${selected_month}

    UNION ALL

    SELECT UAE.car_id,
    "UAE" as Source,
    UAE.tire_type,              
    UAE.km_traveled,            
    UAE.outside_temp,       
    UAE.cabin_temp,                     
    UAE.lights_on
    FROM ctbls.uae_data_me UAE
    WHERE UAE.car_id in(${ID_LIST}) and UAE.cvdc62_partition_month_x >= ${selected_month}

    UNION ALL

    SELECT USA.car_id,
    "USA" as Source,
    USA.tire_type,              
    USA.km_traveled,            
    USA.outside_temp,       
    USA.cabin_temp,                     
    USA.lights_on
    FROM ctbls.usa_data_na USA
    WHERE USA.car_id in(${ID_LIST}) and USA.cvdc62_partition_date_x >= ${selected_day}
),
car_dim AS (
    -- 第二段车辆维度表查询
    select CARDim.ID,
    CARDim.edition,
    CARDim.sale_date,
    CARDim.sale_country,
    CARDim.model_year,
    CARDim.test_date,
    CARDim.test_type, 
    CARDim.executed_by,
    CARDim.pass_comm,
    CARDim.techni_comm,
    CARDim.customer,
    CARDim.`return` -- return是Hive关键字,用反引号包裹避免语法错误
    from test_db.car_dimension CARDim
    where ID IN (${ID_LIST})
)
-- 关联两个结果集,可根据需求替换为INNER JOIN/LEFT JOIN/RIGHT JOIN
SELECT * 
FROM travel_data t1
LEFT JOIN car_dim t2
ON t1.car_id = t2.ID;

方案2:子查询嵌套写法(兼容所有Hive版本)

source  /s/mysdrive/6298.hql;
set hivevar:selected_month= "2021-01";
set hivevar:selected_day=TO_DATE("2021-01-01");

SELECT * 
FROM (
    -- 第一段三地行驶数据UNION ALL查询
    SELECT CANADA.car_id,
    "CANADA" as Source,
    CANADA.tire_type,               
    CANADA.km_traveled,         
    CANADA.outside_temp,    
    CANADA.cabin_temp,                      
    CANADA.lights_on
    FROM ctbls.can_data_na CANADA
    WHERE CANADA.car_id in (${ID_LIST}) and CANADA.cvdc62_partition_month_x >= ${selected_month}

    UNION ALL

    SELECT UAE.car_id,
    "UAE" as Source,
    UAE.tire_type,              
    UAE.km_traveled,            
    UAE.outside_temp,       
    UAE.cabin_temp,                     
    UAE.lights_on
    FROM ctbls.uae_data_me UAE
    WHERE UAE.car_id in(${ID_LIST}) and UAE.cvdc62_partition_month_x >= ${selected_month}

    UNION ALL

    SELECT USA.car_id,
    "USA" as Source,
    USA.tire_type,              
    USA.km_traveled,            
    USA.outside_temp,       
    USA.cabin_temp,                     
    USA.lights_on
    FROM ctbls.usa_data_na USA
    WHERE USA.car_id in(${ID_LIST}) and USA.cvdc62_partition_date_x >= ${selected_day}
) t1
-- 关联维度表,可根据需求替换为INNER JOIN/LEFT JOIN/RIGHT JOIN
LEFT JOIN (
    select CARDim.ID,
    CARDim.edition,
    CARDim.sale_date,
    CARDim.sale_country,
    CARDim.model_year,
    CARDim.test_date,
    CARDim.test_type, 
    CARDim.executed_by,
    CARDim.pass_comm,
    CARDim.techni_comm,
    CARDim.customer,
    CARDim.`return`
    from test_db.car_dimension CARDim
    where ID IN (${ID_LIST})
) t2
ON t1.car_id = t2.ID;

注意事项

  • 关联类型可按需调整:仅保留两边都匹配的数据用INNER JOIN,保留所有行驶数据即使无对应维度信息用LEFT JOIN
  • 变量配置语句必须放在SQL最开头才能正常生效
  • 若不需要返回全字段,可以替换SELECT *为指定的字段列表,避免car_id和ID重复返回

内容的提问来源于stack exchange,提问作者Jupiter22

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 01:06:04