如果我有这样一个数据集 199.72.81.55 - - [01/Jul/1995:00:00:01 -0400] "GET /history/apollo/ HTTP/1.0" 200 6245
我正在用hadoop运行map reduce作业,如何获得每行中的最后一个元素?
我试过所有明显的答案,比如 String lastWord = test.substring(test.lastIndexOf(" ")+1);
但这给了我 -
性格。我试过根据一个空格拆分它,得到最后一个元素,但最后一个字符仍然是一个空格 -
.
我不能指望数据会一行一行地传递给我。换言之,我可以不期待一个文件的形式 a b c d \n e f g h\n
要一行一行地送吗?
有没有人对如何在这一行中说出最后一句话有什么建议?
这是我的map函数的一个片段,我尝试在其中获取数据:
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String test = value.toString();
StringTokenizer tokenizer = new StringTokenizer(test);
//String lastWord = test.substring(test.lastIndexOf(" ")+1); <--first try
//String [] array = test.split(" ");//<--second try
//one.set(Integer.valueOf(array[8]));
int i = 0;
String candidate = null;
while (tokenizer.hasMoreTokens()) {
candidate = tokenizer.nextToken();
if (i == 3) {
//this works to get the date field
String wholeDate = candidate;
String[] dateArray = wholeDate.split(":");
String date = dateArray[0].substring(1); // get rid of '['
String hour = dateArray[1];
word.set(date + " " + hour);
} else if (i == 7) {
// <-- third try
String replySizeString = candidate;
one.set(Integer.valueOf(replySizeString)); }
}
i++;
1条答案
按热度按时间ndasle7k1#
不使用stringtokenizer,只需使用string[]string.split(string regex)方法为每行返回字符串数组即可。然后,假设数据的每一行都有相同数量的字段,用空格隔开,您只需查看该数组元素即可。
或者如果你知道你总是想要最后一个标记,你可以看到数组有多长,然后抓取最后一个元素。