Java 使用Hadoop处理非结构化数据+;地图还原
我想使用hadoop来处理非结构化的CSV文件。这些文件是非结构化的,因为它们包含来自不同类型、不同行长的多个数据值。此外,有数百个这样的文件,它们的大小通常相对较大(>200Mb) 每个文件的结构如下所示:Java 使用Hadoop处理非结构化数据+;地图还原,java,hadoop,mapreduce,Java,Hadoop,Mapreduce,我想使用hadoop来处理非结构化的CSV文件。这些文件是非结构化的,因为它们包含来自不同类型、不同行长的多个数据值。此外,有数百个这样的文件,它们的大小通常相对较大(>200Mb) 每个文件的结构如下所示: Book , ISBN , BookName , Authors , Edition Book , 978-1934356081, Programming Ruby 1.9 , Dave Tho
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
对变得更加困难
例如,我想计算每本书的平均、最大和最小价格(可以按ISBN合并/分组)。我意识到我可以做一些预处理,将数据提取到有序的、一种类型的CSV文件中,并从中开始工作(使用grep、python、awk等),但这将破坏使用M/R+Hadoop的意义,并且需要大量额外的工作
我曾想过使用多个映射阶段,但我对所有这些都相当陌生,不确定如何/从何开始
如何为示例文件/查询实现这样的M/R作业(Java)?谢谢。我遇到了类似的情况,并做了以下设计:
我已经开发了使用OpenCSV解析器实际分割记录的输入格式。然后 我将MapWritable填充为一个值。每个映射包含一条带有“字段名->字段值”条目的记录
在您的情况下,我将使用类似枚举器的键,其中包含记录类型,如“价格记录”、“作者记录”等。
然后在mapper中,您可以编写相对简单的代码来识别感兴趣的记录并将其聚合
更复杂但更有益的方法是为配置单元创建SerDe,它将文件映射到结构表中:记录类型(如上所述)和KeyValueMap列。(列的配置单元支持映射类型)。然后您就可以针对半结构化数据创建SQL。
非常酷的方法,谢谢。你介意分享一些实际的实现细节/代码吗?David,你是如何将头从文件中分离出来的?通常我编写输入格式,它派生自TextInputFormat,对第一个字符串进行特殊处理