我是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()之外,还有其他任何替代方法吗?
答案 0 :(得分:1)
您可以一次为每行使用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
}
}
免责声明:完全未经测试
答案 1 :(得分:1)
@Hanry:你为什么不使用相同的java StringTokenizer 。您所要做的就是标记wrt空间,获取总令牌数,然后迭代并使用First和Second标记,并将后续标记连接成第三个字符串。