如何从tsv文件创建序列文件进行文本分类

时间:2014-07-29 15:32:38

标签: apache hadoop machine-learning mahout

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

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

我正在尝试提供Mahout的nbayes来对文本部分进行pos或neg分类。

我的第一次尝试是在每个行上使用mahout seqdirectory命令作为其类目录中的单独文件。这适用于少量数据但最终在OutOfMemoryException下大约30 GB的数据失败。由于存在大量单独的文件,增加堆大小会因“超出GC开销限制”而失败。

我的第二次尝试是将数据加载到配置单元表并将其转换为序列文件,如此处所述[0],它似乎首先工作正常,但在创建矢量文件并拆分数据集之后trainnb步骤因ArrayIndexOutOfBounds异常而失败。

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

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

2 个答案:

答案 0 :(得分:0)

如果其他人需要解决相同或类似的问题,请自行回答:

我找到了此代码段at github并根据我的需要对其进行了修改。另外,我必须修剪值字符串以获得正确的结果。

答案 1 :(得分:0)

对于那些在将来搜索此答案的人来说,这可能是一个更简单的实现。这可以完全从命令行完成(我在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是Amazon EMR(AMI 3.4.0)上hadoop-streaming.jar的位置。根据您的配置,它可能位于不同的位置。