如果我的数据集包含这样的行 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++;
最佳答案
除了使用 StringTokenizer,您还可以使用 String[] String.split(String regex) 方法为每一行返回一个字符串数组。然后,假设你的每一行数据都有相同数量的字段,用空格分隔,你可以只看那个数组元素。
String line = value.toString();
String[] lineArray = line.split(" ");
String lastWord = lineArray[9];
或者如果您知道您总是想要最后一个标记,您可以查看数组的长度,然后只获取最后一个元素。
String lastWord = lineArray[lineArray.length - 1];
关于java - 获取传递给 hadoop 映射器的行的最后一个字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19971287/