Есть ли встроенная функция в Hive, которая рассчитывает пересечение двух списков в таблице улья? - PullRequest
0 голосов
/ 17 мая 2019

У меня есть таблица улья, которая имеет 3 столбца: ["merchants_index", "days_index", "customer_index"]. Конечная цель - рассчитать процент повторных клиентов для каждого продавца в каждую неделю. Под повторяющимся покупателем я имею в виду, например, покупателя, который совершал покупки у продавца и на неделе 10, также покупал у того же продавца в предыдущие 4 недели (недели 6-9).

Вот мой подход:

шаг 1, создайте список клиентов за текущую неделю и еще один список клиентов за предыдущие 4 недели для каждого продавца и каждой недели.

select 
merchant_index, 
week_index, 
collect_set(customer_index) over(partition by merchants_index range between 0 preceding and current row) AS uniq_cust_current,
collect_set(customer_index) over(partition by merchants_index range between 4 preceding and 0 preceding) AS uniq_cust_repeat
from
source_table

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

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

len(numpy.intersect1d(uniq_cust_current, uniq_cust_repeat))* 1.0/ len(uniq_cust_current)

Кроме того, у меня есть только встроенные функции в улье и искре.

Причина, по которой я участвую в Hive и Spark, заключается в том, что я не знаю, как сравнивать списки в Hive, и я не знаю, как выполнить расчет движущегося окна в Spark.

Однако, поскольку таблица кустов огромна, более 100 миллионов строк, вывод первого шага требует слишком много памяти, поэтому задание будет уничтожено.

Любая помощь будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 18 мая 2019

В Hive вы можете использовать brickhouse intersect_array UDF Эта функция не является встроенной, вам нужно скачать и собрать JAR, после добавления JAR вы можете создать функцию и использовать ее:

 CREATE TEMPORARY FUNCTION intersect_array AS 'brickhouse.udf.collect.ArrayIntersectUDF';

select intersect_array(array1, array2, ...)
0 голосов
/ 18 мая 2019

Имеется функция Spark array_intersect:

array_intersect (array1, array2) - Возвращает массив элементов на пересечении array1 и array2, без дубликатов.

...