我需要读取存储在Hadoop集群上的excel(xls)文件。现在我做了一些研究,发现我需要为此创建一个自定义InputFormat 。我阅读了很多文章,但从编程的角度来看,它们都没有用。如果有人可以帮我编写自定义inputformat的示例代码,以便我可以理解“编程InputFormat”的基础知识,并可以使用Apache POI库来读取excel文件。 我制作了一个用于阅读文本文件的mapreduce程序。现在我需要帮助,因为即使我有一些如何设法编写我自己的自定义InputFormat ,我将编写与我已编写的mapreduce程序相关的代码。
PS: - 将.xls文件转换为.csv文件不是一种选择。
答案 0 :(得分:1)
是的,您应该创建RecordReader
来阅读Excel文档中的每条记录。在该记录阅读器内部,你应该使用像api这样的POI来阅读excel文档。更准确地说,请执行以下步骤:
扩展FileInputFromat
并创建自己的CustomInputFrmat
并覆盖getRecordReader
。
通过扩展CustomRecordReader
创建RecordReader
,在这里您必须编写如何从给定的filesplit生成键值对。
因此,首先从filesplit读取字节,然后从bufferedbytes读取所需的键和值,使用POI。
您可以在此处检查我的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