【问题标题】:top 10 path reduction map reducetop 10 路径缩减图 reduce
【发布时间】:2013-10-18 05:37:36
【问题描述】:

我正在做一个需要路径导航图的项目。

问题描述: 为了提供项目上下文,示例 UI 应类似于:http://bl.ocks.org/mbostock/4063570 .不同的是它将用于站点导航。我的问题是在后端处理数据。

对于用户路径 A->B->C->D->E 我预计算的数据格式如下:

Origin:Start:End:Level
A  A  B  L1
A  B  C  L2
A  C  D  L3
A  D  E  L4

现在,假设我有数百万条这样的记录,其中包含 100 个 Origin,我可以对它们进行分组、汇总大小并按大小 desc 排序并取前 10 个。所以对于每个 origin、start 和 Level,我应该有 10 个记录每一个。 因此,对于 4 个级别的图表,对于图中的给定起始节点,我将有 10.. 10^2.. 10^3.. 10^4。

真正的问题: 排序后的前 10 名并不能带走所有不需要的 L3 和 L4。对于给定的原点,L1 的结束应该是 L2 的开始,L2 的结束应该是 L3 的开始,依此类推。由于这个原因,我有许多记录,其中许多 L2 开始不属于 L1 结束,并且随着级别的增加而倍增。 插图:

A  A  B  L1
A  B  C  L2
A  F  G  L2   <-- this comes in top 10 after aggregation, but start is not the end of L1 (B in this case)

我尝试了什么:在对前 10 名进行排序和切片后,我对每个级别的数百万条记录进行自联接 1 到 1。我有 10 个级别。它在计算上非常昂贵。

我在寻找什么: 通用且成本较低的 Map-reduce 解决方案。如果我能在烫伤的情况下得到它就更好了。

【问题讨论】:

    标签: hadoop graph mapreduce bigdata scalding


    【解决方案1】:

    这里我有一个解决方案,但我不确定它是否适合你:

    我想你想要做的是带走所有不需要的记录,比如:

    A A B L1

    A B C L2

    A F G L2(不适合,带走,因为没有从A到F通过L2开始)

    所以当拿走一些不需要的记录时,我们必须知道这些记录是否需要;我给出的解决方案如下:

    首先我们必须有一个内存数据结构 DB(类似于 Redis 或 Hazelcast);在第一个 MapReduce 中,我们只向内存数据结构 DB 插入数据;我们在这里插入的是地图数据(key是start:level,比如A:L1 B:L5,value是一个List,也就是end)

    所以地图可能是这样的:

    A:L1->B

    A:L2->C G

    在第一个 MapReduce 之后,我们将知道所有需要的记录,因为我们有 InMemoryDB; 第二个 MapReduce 我们取出不适合的记录;

    我们可以在mapper中判断一个像A F G L2这样的记录我们像getList一样查询InMemoryDB中的Map,使用键A:L1(使用这个是因为我们在这里从L2开始表单A)是List中的F;如果 F 是 In 则需要,如果不是则不需要;

    【讨论】:

    • 感谢您花时间了解。这实际上正是问题所在。第二个 map reduce 将为 L2 执行此操作。我需要为每个连续级别重复该过程。 L1 地图过滤器 L2。 L2 地图过滤器 L3....最多 10 级。这很贵。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-27
    • 1970-01-01
    • 2017-03-10
    • 2012-02-10
    • 1970-01-01
    • 2013-08-12
    相关资源
    最近更新 更多