0

如果我有一个包含这样行的数据集,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中的文件逐行传递吗?

有没有人有关于如何获得这一行的最后一个词的任何提示?

这是我的地图函数的一个片段,我尝试在其中获取数据:

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++;
4

1 回答 1

2

除了使用 StringTokenizer 之外,您还可以使用 String[] String.split(String regex) 方法为每一行返回一个字符串数组。然后,假设您的数据的每一行都有相同数量的字段,用空格分隔,您可以只查看该数组元素。

String line = value.toString();
String[] lineArray = line.split(" ");
String lastWord = lineArray[9];

或者,如果你知道你总是想要最后一个标记,你可以看到数组有多长,然后只抓取最后一个元素。

String lastWord = lineArray[lineArray.length - 1];
于 2014-03-28T19:54:30.577 回答