使用impala连接id字段上的两个表

eblbsuwk  于 2021-06-26  发布在  Impala
关注(0)|答案(3)|浏览(392)

我在hdfs中有两个表,我想使用impala连接它们。一个是员工日志,另一个是人力资源数据。
查询:

select e.employee_id, e.action from Employee_Logs e where e.employment_status_desc = 'Active'
select h.employee_id, h.name from HR_Data h

员工日志:

employee_id  action
2325255b     login     
51666164     login
51666164v    login
r1211        logoff
r18552421    login

人力资源数据:

employee_id  name
2325255      Rob    
51666164     Tom
r1211        Tammy
r18552421    Ron

我想加入他们,使数据看起来像这样:

employee_id  action  name
2325255b     login   Rob  
51666164     login   Tom
51666164v    login   Tom
r1211        logoff  Tammy
r18552421    login   Ron

如果employee\u id字段在两个表上都匹配,我可以做一个简单的连接,但是同一个用户的employee id后面可以有一个“b”或“v”来指定帐户是否像管理员帐户一样被提升。有些用户帐户的id前面有一个“r”,但在两个表中都是这样。
有没有一种方法可以让我执行一些where操作并在employee\u logs表中创建一个新字段,比如从employee id的末尾去掉“v”和“b”,然后加入,还是有更好的方法?

hrysbysz

hrysbysz1#

Select employee_id,action,h1.name from Employee_Logs 
   where RTRIM(employee_id,'b','v'),name IN (Select employee_id,name 
   from HR_DATA as h1);

您可以像上面那样使用子查询,因为您在employee\u日志本身中拥有所需的大多数记录,并引用公共id来获取每个记录的名称。或左连接是在这种情况下使用的最佳方法,因为well-means将给出两个表共用的数据,保持左表数据为多数

fkvaft9z

fkvaft9z2#

也许最安全的方法是多重的 left 连接:

select el.*,
       coalesce(h.name, hv.name, hb.name) as name
from employee_logs el left join
     hr_data h
     on el.employee_id = h.employee_id left join
     hr_data hv
     on el.employee_id = concat(h.employee_id, 'v') left join
     hr_data hb
     on el.employee_id = concat(h.employee_id, 'b');
ymzxtsji

ymzxtsji3#

使用 regexp_replacejoin 条件,替换位置 b 或者 v 在字符串的末尾使用一个空字符串来匹配雇员id。

select el.employee_id,el.action,hr.name
from employee_logs el
join hr_data hr on hr.employee_id = regexp_replace(el.employee_id,'[bv]$','')

相关问题