使用Impala

时间:2018-11-26 17:20:21

标签: sql impala

我想使用Impala加入HDFS中的两个表。一个是Employee_Logs,另一个是HR_Data。

查询:

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_Logs:

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

HR_Data:

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_id字段在两个表上都匹配,那么我可以进行轻松连接,但是同一用户的雇员id后可以有“ b”或“ v”,以指定该帐户是否像管理员帐户一样被提升。某些用户帐户的ID前面带有“ r”,但两个表均是如此。

有没有一种方法可以执行一些操作,并在Employee_Logs表中创建一个新字段,例如从员工ID的末尾去除“ v”和“ b”,然后加入,或者有更好的方法?

3 个答案:

答案 0 :(得分:1)

最安全的方法可能是多个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');

答案 1 :(得分:1)

   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_logs本身所需的大多数记录,并引用了公共ID来获取每个记录的名称。   或者在这种情况下最好使用左联接,这意味着将为两个表提供共同的数据,并保持左表的数据为多数

答案 2 :(得分:1)

regexp_replace条件下使用join,在该条件下,您将字符串末尾的bv替换为空字符串以匹配员工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]$','')