Добавить идентификатор группы по hiveql - PullRequest
2 голосов
/ 21 октября 2019

У меня есть таблица в hadoop, в которой есть 2 столбца, содержащие строковые данные.

Итак, для таблицы, которая выглядит следующим образом:

+---------+------+
|   v1    | v2   |
+---------+------+
|    1    | 2    |
|    1    | 3    |
|    2    | 3    |
|    4    | 5    |
|    6    | 7    |
+---------+------+

Теперь я хочу добавить идентификатор группы в каждую строку. Независимо от того, к каким столбцам принадлежат значения, строки с одинаковыми значениями получают одинаковый идентификатор группы.

Итак, как показано ниже.

+---------+------+------+
|   v1    | v2   | gid  |
+---------+------+------+
|    1    | 2    | 1    |
|    1    | 3    | 1    |
|    2    | 3    | 1    |
|    4    | 5    | 2    |
|    6    | 7    | 3    |
+---------+------+------+

Как мне написать, чтобы получить это с помощью hiveql?

1 Ответ

2 голосов
/ 23 октября 2019

В общем, это проблема обхода графика, как говорит @GordonLinoff, но если задачу можно сократить до такой же, как в вашем примере, с ограниченными столбцами и правилом упорядочения (я предположил, что порядок строк определяется вашими столбцами),задача вполне решаема. Посмотрите эту демонстрацию, используя ваш набор данных, она дает желаемый результат (см. Комментарии в коде):

with your_data as ( --your data example
select stack (5,
1, 2,
1, 3,
2, 3,
4, 5,
6, 7 
) as (v1,v2)
) --your data example

select v1, v2, --calculate group Id as a running count of new_grp
       count(new_grp) over(order by v1, v2 rows between unbounded preceding and current row) as gid
from
(
select v1, v2, --calculate new_grp flag
       case when ((not array_contains(prev_tuple,v1) and not array_contains(prev_tuple,v2)) or prev_tuple is null) then true end as new_grp
from
(
select v1, v2, lag(tuple) over (order by v1, v2) prev_tuple --get previous values in array, to simplify code a little bit
  from (select v1, v2, array(v1, v2) as tuple from your_data) s
)s
)s; 

Результат:

v1      v2      gid
1       2       1
1       3       1
2       3       1
4       5       2
6       7       3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...