之外,还有其他方法可以解决这个问题吗
我是hadoop和mapreduce的新手。在mapper中,我将用以下给定格式的文本文件中的前几行标记这些数据
9593C58F7C1C5CE4 970916072134 levis
9593C58F7C1C5CE4 970916072311 levis strause & co
9593C58F7C1C5CE4 970916072339 levis 501 jeans
45531846E8E7C127 970916065859
45531846E8E7C127 970916065935
45531846E8E7C127 970916070105 "brazillian soccer teams"
45531846E8E7C127 970916070248 "brazillian soccer"
45531846E8E7C127 970916071154 "population of maldives"
082A665972806A62 970916123431 pegasus
F6C8FFEAA26F1778 970916070130 "alicia silverstone" cutest crush batgirl babysitter clueless
945FF0D5996FD556 970916142859 mirc
使用String Tokenizer,我无法分割这些数据,它会混淆机器从这个文件中捕获数据。除了String.split()
@Hanry:为什么不使用相同的javaStringTokenizer呢。您所要做的就是标记化wrt空间,获得总标记计数,然后迭代并使用第一个和第二个标记,并将后续标记连接到第三个字符串中。
您可以使用TextInputFormat一次给每一行,如果它真的是固定宽度格式,并且您有恒定数量的字段(3),那么您可以执行以下操作:
Text token1 = new Text();
Text token2 = new Text();
Text token3 = new Text();
protected void map(LongWritable key, Text value, Context context) {
// 0123456789012345678901234567890123456789
// 1 2 3
// 9593C58F7C1C5CE4 970916072134 levis
if (value.getLength() >= 37) {
token1.set(value.getBytes(), 0, 16);
token2.set(value.getBytes(), 20, 12);
token3.set(value.getBytes(), 26, value.getLength() - 26);
// TOFO: Do something with these tokens
} else {
// TODO: handle bad record length
}
}
免责声明:完全未经测试的