【发布时间】:2015-10-05 08:04:53
【问题描述】:
我想使用 hadoop 来处理非结构化的 CSV 文件。这些文件是非结构化的,因为它们包含来自不同类型的具有不同行长的多个数据值。此外,这些文件有数百个,而且它们的大小通常相对较大(> 200Mb)。
每个文件的结构可以这样展示:
Book , ISBN , BookName , Authors , Edition
Book , 978-1934356081, Programming Ruby 1.9 , Dave Thomas, 1
Book , 978-0596158101, Programming Python , Mark Lutz , 4
...
BookPrice, ISBN , Store , Price
BookPrice, 978-1934356081, amazon.com , 30.0
BookPrice, 978-1934356081, barnesandnoble.com , 30.67
BookPrice, 978-0596158101, amazon.com , 39.55
BookPrice, 978-0596158101, barnesandnoble.com , 44.66
...
Book , ISBN , BookName , Authors , Edition
Book , 978-1449311520, Hadoop - The Definitive Guide, Tom White , 3
...
文件是自动生成的,我无法控制给定的结构。基本上,有一个标题行,后面跟着包含与标题匹配的值的数据行。行的类型可以通过第一个逗号分隔的词来标识。因此,从示例中,Book 行包含有关书籍的元数据(名称、isbn、作者、版本),BookPrice 包含不同商店/供应商的书籍的各种价格。
我试图了解如何使用 Map/Reduce 对数据执行一些聚合计算。将数据按原样结构化会使理解每个阶段要提取的 key -> value 对变得更加困难。
例如,我想计算每本书的 AVERAGE、MAX 和 MIN 价格(可以按国际标准书号)。我意识到我可以做一些预处理来将该数据提取到有序的单一类型 CSV 文件并从那里工作(使用 grep、python、awk 等),但这会破坏使用 M/R+Hadoop 的意义,并且需要大量额外的工作。
我考虑过使用多个地图阶段,但我对这一切还很陌生,不知道如何/从哪里开始。
如何为示例文件/查询实现这样的 M/R 作业(在 Java 中)?谢谢。
【问题讨论】: