配置单元中是否有任何内置函数可以计算配置单元表中两个列表的交集?

nfeuvbwi  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(401)

我有一个配置单元表,它有3列:[“商家索引”、“周索引”、“客户索引”]。最终的目标是计算每个商家每周的回头客百分比。我的意思是,例如,在第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函数Map到配置单元表,该函数通过比较配置单元表每行的两个列表来计算所需的百分比。
python函数如下:

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

此外,我只有内置的功能在Hive和Spark可用。
我之所以要同时使用hive和spark,是因为我不知道如何比较hive上的列表,也不知道如何在spark中进行移动窗口计算。
但是,由于配置单元表非常大,超过100m行,第一步的输出需要太多内存,因此作业将被终止。
任何帮助都将不胜感激。

kmb7vmvb

kmb7vmvb1#

在hive中您可以使用brickhouseintersect\u array udf这个函数不是内置的,您需要下载并构建jar,然后在添加jar之后您可以创建函数并使用它:

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

select intersect_array(array1, array2, ...)
kqlmhetl

kqlmhetl2#

有一个Spark函数 array_intersect :
array\u intersect(array1,array2)-返回array1和array2相交处的元素数组,没有重复项。

相关问题