如何从tsv文件创建序列文件用于文本分类



我有一个tsv文件,它在类,id和文本中分开,例如

positive    2342    This is very good.
negative    4343    I hate it.

,我正试图喂养Mahout的nbayes来分类文本部分或正或负。

我的第一次尝试是在每一行上使用mahout seqdirectory命令作为其类目录中的单独文件。这种方法在处理少量数据时效果很好,但在处理30gb左右的数据时,使用OutOfMemoryException会失败。增加堆大小失败,提示"超过GC开销限制",可能是因为有大量的独立文件。

我的第二次尝试是将数据加载到hive表中并将其转换为序列文件,正如这里所描述的[0],这似乎在一开始工作得很好,但在创建矢量文件并分割数据集之后,trainnb步骤失败了ArrayIndexOutOfBounds异常。

[0] http://files.meetup.com/6195792/Working%20With%20Mahout.pdf

现在我不知道该找什么。任何想法如何我可以转换tsv文件或hive表到一个序列文件,因为它是由一个目录上的seqdirectory命令生成的?

我要自己回答,以防其他人需要解决相同或类似的问题:

我在github上找到了这个代码片段,并根据我的需要修改了它。此外,我必须修剪值字符串以获得适当的结果。

对于将来搜索这个答案的人来说,这可能是一个更简单的实现。这完全可以从命令行完成(我在EMR中进行了测试):

hadoop jar 
 /home/hadoop/contrib/streaming/hadoop-streaming.jar 
 -D mapred.reduce.tasks=0 
 -inputformat TextInputFormat 
 -input {input_directory}/* 
 -mapper '/bin/cat' 
 -outputformat org.apache.hadoop.mapred.SequenceFileOutputFormat 
 -output {output_directory}

/home/hadoop/contrib/streaming/hadoop-streaming.jar是hadoop-streaming.jar在Amazon EMR (AMI 3.4.0)上的位置。根据您的配置,它可能位于不同的位置。

最新更新