我想在表 A 中提取一些在表 B 中没有条目的列。如何在 Hive 中实现这一点?

Posted

技术标签:

【中文标题】我想在表 A 中提取一些在表 B 中没有条目的列。如何在 Hive 中实现这一点?【英文标题】:I want to extract some columns in a table A that do not have an entry in table B. How can I achieve that in Hive? 【发布时间】:2019-10-30 16:28:13 【问题描述】:

我想在表 (A) 中提取一些在表 (B) 中没有条目的列。我怎样才能在 Hive 中实现这一点?我正在处理一个查询(如下),但目前无法正常工作,请帮忙。

加入列:prd_raw_sf.sf_opportunity_dn 中的 product_name 到 prd_raw_sf.sf_product_pcu_mapping 中的 SFDC_PRODUCT_NAME

select *
FROM prd_raw_sf.sf_opportunity_dn  
JOIN prd_raw_sf.sf_si_accounts_mapping ON prd_raw_sf.sf_opportunity_dn.account_name = prd_raw_sf.sf_si_accounts_mapping.sfdc_account_name
WHERE prd_raw_sf.sf_opportunity_dn.account_name not in (select * from prd_raw_sf.sf_si_accounts_mapping);

【问题讨论】:

【参考方案1】:

left join 反模式出现在这里:

select o.*
from prd_raw_sf.sf_opportunity_dn o
left prd_raw_sf.join sf_si_accounts_mapping m on o.account_name = m.sfdc_account_name
where m.sfdc_account_name is null

查询尝试使用sf_si_accounts_mappingsf_opportunity_dn 中的每条记录进行join,然后where 子句仅过滤无法加入的记录。

使用以下索引,这应该是一个有效的解决方案:

prd_raw_sf.sf_opportunity_dn(account_name )
prd_raw_sf.join sf_si_accounts_mapping(sfdc_account_name)

注意:表别名使查询更短且更易于理解。我已将它们添加到您的查询中,建议您始终使用它们。

【讨论】:

【参考方案2】:

我建议使用not existsjoin 似乎没有必要:

select o.*
from prd_raw_sf.sf_opportunity_dn o 
where not exists (select 1
                  from prd_raw_sf.sf_si_accounts_mapping a
                  where o.account_name = a.account_name
                 );

【讨论】:

【参考方案3】:

您可以使用Left joinLeft semi join

左连接方法:

select a.*
FROM prd_raw_sf.sf_opportunity_dn  as a
LEFT JOIN prd_raw_sf.sf_si_accounts_mapping as b 
      ON a.account_name = b.sfdc_account_name
WHERE b.sfdc_account_name is Null;

左半连接:

select a.*
    FROM prd_raw_sf.sf_opportunity_dn  as a
    LEFT SEMI JOIN prd_raw_sf.sf_si_accounts_mapping as b 
          ON a.account_name = b.sfdc_account_name

与左连接相比,性能方面的左半连接更好,因为它只在第二个表中找到第一个匹配记录时检查并跳过特定键的剩余匹配

【讨论】:

以上是关于我想在表 A 中提取一些在表 B 中没有条目的列。如何在 Hive 中实现这一点?的主要内容,如果未能解决你的问题,请参考以下文章

在表创建脚本中使用变量

根据 Redshift 中其他表的条目在表中插入值

在一对多关系表中,仅从表A中获得在表B中具有多个对应行的那些行

SqlAlchemy 将新字段添加到类并在表中创建相应的列

SAS表联合无键

将数据从一列传输到不同表中的不同列