`

索引过程-delete duplicates

 
阅读更多

去重过程同样很简单,不过需要些技巧。

正如你想的一样,在入手之前我自己也分析,怎样根据url & md5去重呢?去重又怎样实现呢?

*其中我当时想法跟job1(见下面)做法是相近的:url+time;

*而md5去重时我又觉得使用md5+time亦未尝不可,因为当时我没有考虑到score因素,但可以断定的是不能使用md5作为distinct,因为这就是题目要求;

*至于怎样去删除索引 ,当时也没有考虑:)

 

 

让我们先分析一个删除例子:

A多个urls中,如果存在相同的urls,只取最新的一个;

B如果存在相同md5的urls,只保留评分最高或url最短的一个。

 

data model:

 

url
fetch time content score
a.cn 2011-1-1 a 2
a.cn 2011-7-1 b 4
a.cn 2011-5-1 a 1
b.cn 2011-4-1 b 2

 

 

要么,按照A要求 ,第一轮后输出結果如下 :

a.cn
2011-7-1
b
4
b.cn
2011-4-1
b
2

 

再根据B要求,发现这两urls含有相同的content,所以再进行score筛选,結果为:

a.cn
2011-7-1
b
4

 

如果b.cn的评分比a.cn高时,则为另一結果。可见,从实际 上出发,这也是符合需求的。

因为相同的有相同的urls只取最后 一个;当有相同的content时只取score最高的一个,这样导致二种結果:

1.要么相同的urls中有一个最新的留下来了;或者

2.内容相同的url只保留score高的一个。


即取舍原则是:最新的优先;分数高的优先。NOTE:上面先url再md5这个过程是可逆的 。(可以分析一下上面的反过程,結果是一样的)

至于为什么先进行url再到md5,其实已经不太重要了?

 

*****************************

注意以上过程未严格的考虑url与content的对应关系,极端情况下,url与content 是m:n的关系,如

一个url可以对应多个content,比如页面中存在时间,不同的访问时间生成的内容不一样;

同样的content,如404页面,只要是访问了不存在的url都会进行这个页面。

******************************

 

好了,现在开始进行分析,其实上面过程也大概反应了这个dedup的过程:

1.url-distinct job

input :利用inputFormat改写了输入格式,在next()时对<url,Indexdoc>进行了数据shipping,其中indexdoc是对索引 中的doc的简单encapsulation,包括hash,score,tstamp etc.

*其中next方法遍历了所有的doc;

*同时拆分原则也是一份index一个split,这样保证在递归输入<key,value>到mapper之前 是可以让next()中的reader完整读取index,因为一个split生成一个对应 的recordReader;

*同时让url作为key也可以保证了处理需求,即上述A要求

 

mapper :use default

reducer :对url相同的进行distinct,如果是最后 个则标记为keep=true,表明是将要以md5与其它比较取舍。

 

output :<MD5Hash,indexdoc>,在reduce中对上述的key进行了转换,方便后续job处理。

 

note:这里使用了默认的partition,所以相同 的url去到想再的reducer,保证了不至于url混跑。

 

2.md5-distinct job

input:上述输出

 

mapper:default

 

partition:对md5进行hash。注意已经改写了hashCode(),只返回高四位的hash

 

reducer:将job1中标记为false的直接输出(待删除索引 );只保留true的一个(如果存在),然后与其中md5相同的url进行比对,得出score top1或min(url lengh)的一个(不输出)

 

 

output:注意些又将job1中的<md5,indexdoc>退回它的输入格式,即<url,indexdoc>

 

3.delete-index job

input:如上

mapper:对上述的输出进行转换:<index-path,docid>

reducer:根据 indexpath和docid进行删除索引。(其实这个reader不可以提取出来复用,因为这是根据 不同的indexpath进行发分的)

output:由于索引已经在red阶段已经处理了,没有输出必要,所以改写了outputformat.

 

*索引删除时是按照docid进行了,一方面增高性能;其次是如果利用url,因为可能相同的有多个(如上述)这述造成删除错误。

 

其中具体的删除流程如下图:



环境假定:

有三份索引 (所以有三个mappers)

指定二个reducers(固每次map之后都有二个r,数据均匀的理论值)

默认使用SequenceFileInputFormat(splitable)

 

 

分析 :

在job2-3之间的mappers是不确定 的,根据 当时的运行情况进行splits;

在每次map完后又恢复至二个r;

在job3,我们有理由 相信其中的一个r被分发的数据大于另一个,这是因为分发时使用了indexpath-hash来实现的。固图中浓黑色的一个数据是多的,另一个是小的;

所以由数据多的r将负责index dedup的任务就多了一个;

 

总之,一个red可以对应 多个index dedup(由于r处理时是按key按sequential order input的,所以不会出现 一份索引 被多个r处理的局面,初初看到其中的reader在每次r时构成一个感觉耗费很大,其实不然);但反之不然。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 大小: 28 KB
  • 大小: 27.2 KB
分享到:
评论

相关推荐

    go代码-https://leetcode-cn.com/problems/insert-delete-getrandom-o1-duplicates-allowed/comments/ 381. O(1) 时间插入、删除和获取随机元素 - 允许重复

    标题 "go代码-https://leetcode-cn.com/problems/insert-delete-getrandom-o1-duplicates-allowed/comments/" 指向的是一个LeetCode上的编程挑战,题目编号381,要求实现一个数据结构,支持在O(1)时间复杂度内进行...

    Delphi中-TStringList-的详细用法.doc

    - Delete 方法根据索引删除一个元素。 - LoadFromFile 和 SaveToFile 分别用于从文件加载和保存列表。 - Clear 清空列表内容。 - Free 释放TStringList对象的内存。 5. **Duplicates 属性**: Duplicates 属性...

    ABAP 常用语句 数据读取 删除 修改 等语句 常用语句ABAP

    DELETE ADJACENT DUPLICATES FROM itab2 COMPARING posnr. ``` - 解析:首先按照`posnr`和`datuv`字段降序排序表`itab2`,然后删除所有相邻的重复项,只保留第一个出现的记录。 - **按索引删除**: - 示例代码...

    222222222222

    - **删除缺失值**(B.delete()):虽然这里提到的`delete()`并不是Python中标准的数据处理方法,但在实际应用中通常会使用Pandas库中的`dropna()`方法来删除包含缺失值的行或列。 ### 数据可视化 - **单变量分布**...

    要在COBOL中使用文件

    在**过程部**,你会使用如`OPEN`, `READ`, `WRITE`, `DELETE`等语句进行实际的文件操作。`OPEN`用来打开文件,`READ`和`WRITE`进行读写操作,`DELETE`则用于删除文件记录。 以下是一些示例: 1. **顺序文件**: ``...

    第六章课后习题1

    5. 创建唯一索引时,如果创建索引的列有重复值,应先将其【去除重复(remove duplicates)】,否则索引不能创建成功。 6. 索引一旦创建,将由【数据库管理系统(DBMS)】管理和维护。 7. 在每次访问视图时,视图都是...

    TStringList常用属性及方法

    - **删除元素**:使用`Delete`方法可以删除指定索引处的元素。例如: ```pascal List.Delete(0); ``` - **清空列表**:`Clear`方法用于清空整个列表。例如: ```pascal List.Clear; ``` #### 八、读写文件 - ...

    ABAP代码性能指导

    - **避免使用SELECT DISTINCT**:使用`DELETE ADJACENT DUPLICATES`来替代`SELECT DISTINCT`,以提高性能。 - **使用CASE-ENDCASE而非IF-ENDIF**:使用`CASE-ENDCASE`结构可简化代码并提高性能。 - **优化变量赋值**...

    实例学SAP ABAP编程

    6. `DELETE ADJACENT DUPLICATES FROM itab COMPARING fieldlist`:删除相邻的重复行,fieldlist定义比较的字段。 内表记录数的获取有两种方法: 1. `data a type i. a = lines( itab ).`:使用`lines`函数直接获取...

    ABAP最详细的开发规范

    - 示例:利用SORT、DELETE ADJACENT DUPLICATES等操作减少数据处理时间。 **10.3 其他语句** **10.3.1 CASE语句** - 使用 `CASE` 语句代替多个 `IF` 条件。 - 示例:`CASE lv_choice WHEN 'A'.`。 **10.3.2 ...

    顺序表的基本操作的实现

    int removeDuplicates(sqlist& S) { if (S.empty()) return 0; int tracker = 0; for (int i = 1; i (); i++) { if (S.get(i) == S.get(tracker)) { S.delete(i); i--; } else { tracker++; } } return S...

    python数据分析模块:numpy、pandas全解(csdn)————程序.pdf

    - **一维和二维数组的元素选取**:通过索引或切片来选取数组中的元素。 4. **数组的重塑和转置** - **reshape()函数**:改变数组的形状,保持数组元素总数不变。 - **flatten()和ravel()函数**:将多维数组转换...

    EXCEL_VBA常用代码实战大全

    - 结合`Range("A1").RemoveDuplicates`方法实现。 33. **定位删除特定内容所在的行** - 通过查找特定内容并定位到所在行,再删除实现。 34. **判断是否选中整行** - 通过`Target.EntireRow.Selected`判断。 35...

    Abap效率.docx

    例如,不要使用`SELECT DISTINCT`,可尝试用`SORT BY`和`DELETE ADJACENT DUPLICATES`来替代。尽量减少子查询和嵌套SELECT...ENDSELECT的使用,因为它们会增加执行次数。在索引字段上避免使用NOT, 等不等操作符,...

    Delphi中TStringList的用法_构造简单数据库.rar

    `Delete`方法根据索引删除字符串,例如`StringList.Delete(0)`。`Remove`方法根据内容删除字符串,但需要提供要删除的字符串。 4. **访问字符串** 可以通过索引访问字符串,如`var Str: string; Str := String...

    es-dedupe:用于从Elasticsearch删除重复文档的工具

    每次DELETE操作之后,我们都等待索引更新。 处理过的文档将登录到/tmp/es_dedupe.log 。 不幸的是,聚合查询不一定是精确的。 基于/tmp/es_dedupe.log日志文件,我们查询每个field值,并在其他分片上删除文档副本。...

Global site tag (gtag.js) - Google Analytics