Соедините две таблицы в полях идентификатора, используя Impala - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть две таблицы в HDFS, к которым я хочу присоединиться, используя Impala.Один - 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 совпало в обеих таблицах, но у одного и того же пользователя могут быть буквы "b" или "v"после идентификатора их сотрудника, чтобы указать, повышена ли учетная запись как учетная запись администратора.В некоторых учетных записях перед идентификатором стоит «r», но в обеих таблицах это так.

Есть ли способ, где я могу выполнить некоторые действия, где можно создать действия и создать новое поле в таблице Employee_Logs, например убрать "v" и "b" с конца идентификатора сотрудника, а затем присоединиться или есть?лучший способ?

Ответы [ 3 ]

0 голосов
/ 26 ноября 2018
   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, и вы берете ссылку на общие идентификаторы, чтобы получить имя для каждой записи.Или левое соединение лучше всего использовать в таких ситуациях, так как смысл даст данные, которые являются общими для обеих таблиц, сохраняя данные левых таблиц как большинство

0 голосов
/ 26 ноября 2018

Используйте regexp_replace в условии join, где вы заменяете b или v в конце строки пустой строкой для соответствия идентификатору сотрудника.

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]$','')
0 голосов
/ 26 ноября 2018

Вероятно, самый безопасный метод - это несколько 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');
...