Hive UDF для генерации всех возможных упорядоченных комбинаций из списка
Я пытаюсь выяснить в Hive, как сгенерировать UDF, который будет принимать в качестве входных данных список и выводить список с двухсторонней упорядоченной комбинацией всех элементов в списке
Вход: list_variable_b
[5142430,5146974,5141766]
Вывод: list_variable_b
[(5142430,5146974), (5146974,5141766), (5142430,5141766)]
1 ответ
Итак, вы спрашиваете, как написать UDF, который может занять array<bigint>
и превратить его в array<struct<int,int>
или же array<array<int>
, Кажется, вы хотите, чтобы то, что называется n, взял k, что приведет к (n!)/(Nk)! K! элементы.
Теперь Hive имеет два вида UDF, один из которых простой, который может обрабатывать только примитивные (не собранные) типы. Но здесь вы обрабатываете массив, поэтому вам нужен универсальный UDF. Универсальные UDF могут делать гораздо больше, чем простые UDF, но их также сложнее писать. Хорошее руководство о том, как это сделать, можно найти здесь: http://www.baynote.com/2012/11/a-word-from-the-engineers/
Другой способ будет использовать двойной LATERAL VIEW
с оговоркой, что все элементы в массиве должны быть уникальными, чтобы это работало. Если таблица
create table xx ( col array<int>);
такой, что
select * from xx;
OK
[5142430,5146974,5141766]
Используя двойное боковое представление, чтобы сделать декартово произведение массива на себя, затем получить только пары, у которых один элемент больше другого:
select a1,b1 from xx
lateral view explode(col) a as a1
lateral view explode(col) b as b1 where a1 < b1;
5142430 5146974
5141766 5142430
5141766 5146974