前言
今天在同事的桌子上看到一份简历,看了看。在简历的后面写了几道题,应该是给他准备的面试题。看了下,有点感触,就随便写写吧。
下周,我要和公司签合同,要是不理想可能也得找工作。看到那几道面试题,我自然而然地想到,如果我是应聘者,我该会怎么回答。而我在看这个题目的时候,突然意识到一个问题:我们经常按面试思路去回答问题,而不是按工作中遇到这个问题会怎么处理。
题目
那个题目记不太清楚了,大概描述下:
有一批海量的URL数据,如何去重?或者是说有两份URL数据,如何找出交集。当然,数据量也是海量的,也就是说一台内存搞不定,或说存不了,比如上T。
解答
我看了下同事在题目下面写的答案,感觉比较官方。比较像网上大家的思路。
给了三个答案,具体记不清了,只记得俩:
1、hash到不同节点,分而治之。
2、bloom filter
其实,当我看到题目时,我也是这样想的。可以说,一个应聘者经常按这种思路去想。然后,我就突然意识到如果工作中真遇到这个问题呢?我想我肯定不会这么做的。我就立刻想到了其他的思路。
就比如海量数据去重,我肯定不会用之前那几种方法,如果用hash分而治之思想,那我得写hash方法,写节点间的信息通信,还要解决一堆通信过程中失败的问题。而bloom filter呢,情况也好不了哪里去,而且bloom filter是有误差的。如果,我们跳出面试的思维呢?
我们只需使用个map reduce,map 中就一个cat ,reduce中uniq 的shell命令 就可以了。我们不怕数据量的规模,因为我们可以用N多的节点。相同的数据肯定落在reduce上的相同节点,因为它自带了sort的功能。
就这么简单,几乎就没开发工作量。可见,我们经常的面试,看了过多的面试题,就很容易形成一些思维惯式。