我最近和一位为亚马逊工作的人交谈,他问我:如何使用编程语言对数TB的数据进行排序?
我是C ++人,当然,我们谈到了合并排序,其中一种可能的技术是将数据拆分成更小的尺寸并对每个数据进行排序并最终合并它们。
但实际上,像亚马逊或eBay这样的公司是否有数TB的数据?我知道,他们存储了大量的信息,但是他们会对它们进行排序吗?
简而言之,我的问题是:为什么他们不会将它们排在第一位,而不是分类数TB的数据?
答案 0 :(得分:11)
但实际上,公司是否喜欢 亚马逊/易趣,数TB的数据?一世 知道,他们存储了大量信息但是 排序他们???
是。上次我每天检查Google 处理过的 over 20 petabytes数据 。
他们为什么不把它们排在第一位 第一个地方而不是排序 数TB的数据,是我的问题 概括地说。
编辑:relet非常好;你只需要保留索引并对其进行排序。您可以通过这种方式轻松高效地检索排序数据。您不必对整个数据集进行排序。
答案 1 :(得分:7)
考虑来自服务器的日志数据,亚马逊必须拥有大量数据。日志数据通常在接收时存储,即根据时间排序。因此,如果您希望按产品排序,则需要对整个数据集进行排序。
另一个问题是,很多时候需要根据处理要求对数据进行排序,这可能是事先未知的。
例如:虽然不是太字节,但我最近使用合并排序对24 GB的Twitter关注者网络数据进行了排序。我使用的实现是Dan Lemire教授。
根据用户ID对数据进行排序,每行包含userid,后跟跟随他的用户ID。但是在我的情况下,我想要关于谁跟随谁的数据。因此,我必须在每一行中再次使用第二个用户ID对其进行排序。
然而,对于1 TB的排序,我将使用Hadoop使用map-reduce。 Sort是map函数后的默认步骤。因此,我会选择map function作为identity,NONE作为reduce函数和设置流作业。
Hadoop使用HDFS将数据存储在64 MB的大块中(此值可以更改)。默认情况下,它会按块运行单个映射。在运行map函数之后,map的输出被排序,我想通过类似于merge sort的算法。
以下是身份映射器的链接: http://hadoop.apache.org/common/docs/r0.16.4/api/org/apache/hadoop/mapred/lib/IdentityMapper.html
如果你想按该数据中的某个元素排序,那么我会将该元素作为XXX中的一个键,将该行作为值作为地图的输出。
答案 2 :(得分:6)
是的,某些公司每天至少会对这些数据进行排序。
Google有一个名为MapReduce的框架,可将工作(如合并排序)拆分到不同的框中,并顺利处理硬件和网络故障。
Hadoop是一个类似的Apache项目,你可以自己玩,以便在一组计算机上拆分排序算法。
答案 3 :(得分:3)
每个数据库索引都是数据某些部分的有序表示。如果对其进行索引,则可以对键进行排序 - 即使您不必对整个数据集进行重新排序。
答案 4 :(得分:3)
是。有些公司这样做。或者甚至是个人。您可以以高频交易者为例。高盛(Goldman Sachs)表示,其中一些是众所周知的。他们针对市场运行非常复杂的算法,考虑到过去几年的价格数据,这是价格发行的每一个变化,实际价格(交易AKA作为印刷品)等。对于高挥发性工具,如股票,期货和期权,每天有数GB的数据,他们必须在过去几年里对数千种工具的数据进行科学研究。更不用说它们与市场,天气条件甚至月相相关的消息。所以,是的,有些人会对数TB的数据进行排序。也许不是每天都有,但他们仍然这样做。
答案 5 :(得分:1)
科学数据集很容易遇到太字节。您可以在收集数据时对它们进行排序并以一种方式(比如按日期)存储它们。然而,在某些时候,某人会希望通过另一种方法对数据进行排序,例如,如果你正在使用有关地球的数据,请按纬度。
答案 6 :(得分:0)
大公司会定期对数据和数PB进行排序。我曾为多家公司工作过。就像Dean J所说,公司依靠构建的框架来有效和一致地处理这些任务。因此,数据的用户不需要实现他们自己的排序。但构建框架的人必须弄清楚如何做大规模的某些事情(不仅仅是排序,而是关键的提取,丰富等)。尽管如此,可能还有一些情况需要实现自己的排序。例如,我最近参与了数据项目,该项目涉及使用来自移动应用程序的事件处理日志文件。 对于安全/隐私策略,在将数据移出以进行进一步处理之前,需要对日志文件中的某些字段进行加密。这意味着对于每一行,都应用了自定义加密算法。但是,由于加密与事件的比率很高(相同的字段值在文件中出现100次),因此首先对文件进行排序,加密值,为每个重复值缓存结果更有效。