【问题标题】:Processing unstructured data with Hadoop + MapReduce使用 Hadoop + MapReduce 处理非结构化数据
【发布时间】: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 对变得更加困难。

例如,我想计算每本书的 AVERAGEMAXMIN 价格(可以按国际标准书号)。我意识到我可以做一些预处理来将该数据提取到有序的单一类型 CSV 文件并从那里工作(使用 grep、python、awk 等),但这会破坏使用 M/R+Hadoop 的意义,并且需要大量额外的工作。

我考虑过使用多个地图阶段,但我对这一切还很陌生,不知道如何/从哪里开始。

如何为示例文件/查询实现这样的 M/R 作业(在 Java 中)?谢谢。

【问题讨论】:

    标签: java hadoop mapreduce


    【解决方案1】:

    我遇到了类似的情况并做了以下设计:
    我开发了使用 OpenCSV 解析器来实际分割记录的输入格式。然后 我将 MapWritable 填充为一个值。每个映射都包含一个带有“fieldName->field value”条目的记录。
    在你的情况下,我会让 Key 类似于枚举器,其中包含“价格记录”、“作者记录”等记录类型。

    然后在您的映射器中,您可以编写相对简单的代码来识别感兴趣的记录并聚合它们。

    更复杂但更有价值的方法是为 Hive 创建 SerDe,它将文件映射到结构表中:记录类型(如上所述)和 KeyValueMap 列。 (Hive 支持列的映射类型)。然后您就可以针对您的半结构化数据创建 SQL。

    【讨论】:

    • 非常酷的方法,谢谢。您介意分享一些您的实际实现细节/代码吗?
    • David 你是怎么把文件头和文件分开的?stackoverflow.com/questions/21040166/aggregation-in-mapreduce
    • 通常我写输入格式,派生自TextInputFormat,它对第一个字符串/字符串进行特殊处理
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多