我有一个配置单元表,它有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行,第一步的输出需要太多内存,因此作业将被终止。
任何帮助都将不胜感激。
2条答案
按热度按时间kmb7vmvb1#
在hive中您可以使用brickhouseintersect\u array udf这个函数不是内置的,您需要下载并构建jar,然后在添加jar之后您可以创建函数并使用它:
kqlmhetl2#
有一个Spark函数
array_intersect
:array\u intersect(array1,array2)-返回array1和array2相交处的元素数组,没有重复项。