V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
qqq8724
V2EX  ›  问与答

请教大家一个业务场景问题,关于笛卡尔积

  •  
  •   qqq8724 · 2020-09-28 10:29:36 +08:00 · 1125 次点击
    这是一个创建于 1306 天前的主题,其中的信息可能已经有所发展或是发生改变。

    场景是有一个字符串的集合,集合中元素是类似"id!时间 1,数据项 1&时间 2,数据项 2&时间 3,数据项 3……"的字符串,id 后面的以'&'分割的内容数量不一定,数据项一共有 5 个值。

    现要求集合中两两元素之间的相似度,数据量大概是 50W 。

    算法是只要两个 id 数据项相同,时间在给定阈值内就算相似,按一定规则给一个相似分。等两个 id 的所有时间和数据项比对完毕,把这些相似分加一块,就是这两个 id 的相似度。

    最后结果格式为"id1,id2,相似度"

    现在用 spark 的 cartesian 算子算笛卡尔积,很慢,而且最后没跑出来。

    不知各位有什么好的办法,在此先谢过。

    第 1 条附言  ·  2020-09-28 11:32:24 +08:00
    数据项包括五种值(a,b,c,d,e)

    将(时间+数据项)作为一个组合的话,整体是 id + 多个组合
    8 条回复    2020-09-28 18:29:24 +08:00
    zxCoder
        1
    zxCoder  
       2020-09-28 11:08:00 +08:00   ❤️ 1
    以'&'分割的内容数量不一定,数据项一共有 5 个值

    没看懂
    chocovon
        2
    chocovon  
       2020-09-28 11:58:23 +08:00   ❤️ 1
    不懂笛卡尔积在这里的作用……这个相似度直接用欧式距离表示也行吧?
    qqq8724
        3
    qqq8724  
    OP
       2020-09-28 12:05:49 +08:00
    @chocovon 笛卡尔积是为了两两比对 算相似度 你说的欧式距离没怎么了解过 愿闻其详
    chocovon
        4
    chocovon  
       2020-09-28 12:08:35 +08:00   ❤️ 1
    @qqq8724 就是算向量内积,把各项数据差值的平方相加后开根号
    volvo007
        5
    volvo007  
       2020-09-28 12:38:32 +08:00   ❤️ 1
    感觉就是一个 自连接的 out join 之后,对每个组合计算相似度就好了……
    lidlesseye11
        6
    lidlesseye11  
       2020-09-28 14:47:37 +08:00   ❤️ 1
    不懂 spark,随便说下简单粗暴的思路抛个砖。。

    把数据遍历一遍,整成 Map<数据项,ChronologicalSortedList<Time_Id_Object>> 这样的,然后遍历 Map 就行了
    当然这样会加载所有数据占不少内存。。内存不够的话就多遍历几遍,一次只处理一个数据项。。
    qqq8724
        7
    qqq8724  
    OP
       2020-09-28 17:28:06 +08:00
    @volvo007 对 大体是这个意思
    qqq8724
        8
    qqq8724  
    OP
       2020-09-28 18:29:24 +08:00
    @lidlesseye11 单是数据可以放到内存中,但是当数据自身去匹配的时候,数据会膨胀到很大
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2801 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 12:29 · PVG 20:29 · LAX 05:29 · JFK 08:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.