我想使用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”,然后加入,或者有更好的方法?
答案 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
,在该条件下,您将字符串末尾的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]$','')