用于Excel文件的自定义InputFormat或InputReader(xls)

时间:2014-01-15 09:03:18

标签: java excel hadoop mapreduce

我需要读取存储在Hadoop集群上的excel(xls)文件。现在我做了一些研究,发现我需要为此创建一个自定义InputFormat 。我阅读了很多文章,但从编程的角度来看,它们都没有用。如果有人可以帮我编写自定义inputformat的示例代码,以便我可以理解“编程InputFormat”的基础知识,并可以使用Apache POI库来读取excel文件。 我制作了一个用于阅读文本文件的mapreduce程序。现在我需要帮助,因为即使我有一些如何设法编写我自己的自定义InputFormat ,我将编写与我已编写的mapreduce程序相关的代码。

PS: - 将.xls文件转换为.csv文件不是一种选择。

3 个答案:

答案 0 :(得分:1)

是的,您应该创建RecordReader来阅读Excel文档中的每条记录。在该记录阅读器内部,你应该使用像api这样的POI来阅读excel文档。更准确地说,请执行以下步骤:

  1. 扩展FileInputFromat并创建自己的CustomInputFrmat并覆盖getRecordReader

  2. 通过扩展CustomRecordReader创建RecordReader,在这里您必须编写如何从给定的filesplit生成键值对。 因此,首先从filesplit读取字节,然后从bufferedbytes读取所需的键和值,使用POI。

  3. 您可以在此处检查我的CustomInputFormat和RecordReader以处理自定义数据对象 myCustomInputFormat

答案 1 :(得分:0)

你的研究是正确的。您需要为Hadoop定制InputFormat。如果你很幸运,有人已经为你的用例创建了一个。

如果没有,我建议寻找能够读取excel文件的Java库。 由于Excel是专有文件格式,因此您不太可能找到完美运行的实现。

找到能够读取Excel文件的库后,将其与InputFormat集成。

因此,您必须扩展Hadoop的FileInputFormat。 ExcelInputFormat返回的getRecordReader必须返回excel文件中的行。您可能还必须覆盖getSplits()方法,以告诉框架根本不要拆分文件。

答案 2 :(得分:-1)

或者,您可以尝试在Hadoop / Spark / etc上为Excel提供文件格式的HadoopOffice库。它支持许多功能,包括链接的工作簿和加密。它基于Apache POI。 https://github.com/ZuInnoTe/hadoopoffice/wiki