求一个数据量很大的文件,行与行中某一个字段(列)的交集数

运行环境是在hadoop+hive
例如:
create table tmp_wish_similar_shop as 
select a.itemid as itemid1,similar_cnt(a.sku_id,b.sku_id),b.itemid as itemid2 
from 
(select itemid,sku_id from a ) a
inner join 
(select itemid,sku_id from a ) b
where a.itemid!=b.itemid

sku_id:是一个很长的字符串,存储方式例如(key:value,key:value)一个或多个
a表有一亿条记录,similar_cnt是一个udf函数,是计算不同itemid下的 两个sku_id的交集的个数

hivesql 可以实现,但是出于数据量太大(一亿条),cross join 最后只有一个reduce
如果还是在hadoop环境上有没有其实的解决办法

Dong - Hulu

赞同来自: 开心就好_kxjh

不建议你这么做,这样做性能太低,时间复杂度是O(n^2),如果有一亿条数据,则共计算亿亿次,你觉得你计算资源够吗?   这是一个非常有名的问题,被称为“parallel all pairs similarity ”查找该问题的所有答案。在mahout和spark中都有实现,比较有名的实现算法叫:DIMSUM,具体参考:https://databricks.com/blog/2014/10/20/efficient-similarity-algorithm-now-in-spark-twitter.html​   或google的实现:https://github.com/phoenix24/google-all-pairs-similarity-search   你可以在google中搜索 “”

开心就好_kxjh

赞同来自:

谢谢你的回答,其实还有一种方法就是 把sku_id 进行split 行转列 再  进行关联也是可以的,我就是想偿试一下新的方法多找几个解决方案

要回复问题请先登录注册