Как найти одинаковые элементы в массивах двух разных таблиц в HIVE? - PullRequest
0 голосов
/ 28 мая 2020

У меня есть две таблицы, похожие на следующие:

table1:

id               sid
1   |   ['101', '102', '103']
2   |   ['102', '101', '103']
3   |   ['103', '101', '102']

table2:

id  |            sid
1   |   ['101', '102', '103']
3   |   ['102', '103']

и я wi sh, чтобы получить следующую таблицу :

id               sid
1   |   ['101', '102', '103']
2   |   ['102', '101', '103']
3   |   ['103', '102']

Пояснение: I wi sh, чтобы выбрать одинаковые элементы в table1.sid и table2.sid в том же порядке в table1. Кроме того, если идентификатор в таблице 1 не существует в таблице 2, оставьте sid таким же, как в таблице 1. Что делать?

1 Ответ

0 голосов
/ 28 мая 2020

Вы можете использовать posexplode(), чтобы делать то, что вы хотите. Конечно, все эти массивы более сложны в Hive, чем в других базах данных, особенно получение результатов в нужном вам порядке:

select t1.id, collect_list(sid2)
from (select t1.id, t2.sid2, t1.pos1
      from (table1 t1 lateral view
            posexplode(t1.sid) as pos1, sid1
           ) left join
           (table2 t2 lateral view
            posexplode(t2.sid) as pos2, sid2
           )
           on t2.id = t1.id and t2.sid2 = t1.sid1
      distribute by t1.id
      order by t1.id, t1.pos1
     ) t

Примерно так:

с t как ( выберите t1.id, collect_list (sid2) как sid из (выберите t1.id, t2.sid2, t1.pos1 из (table1 t1 lateral view Posexplode (t1.sid) as pos1, sid1) left join (table2 t2 lateral view Posexplode (t2.sid) as pos2, sid2) на t2.id = t1.id и t2.sid2 = t1.sid1 распределять по t1.id, порядок t1.id, t1.pos1) t выбрать t1.id, (случай, когда size (t.sid) = 0, затем t1.sid else t.sid end) from t1 left join t on t1.id = t.id

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...