簡體   English   中英

使用 Java StringTokenizer 拆分令牌

[英]Splitting the tokens with Java StringTokenizer

我有一個如下所示的數據集:

drawdate    lotterynumbers  meganumber  multiplier
2005-01-04  03 06 07 12 32  30            NULL
2005-01-07  02 08 14 15 51  38            NULL
etc.

和以下代碼:

public class LotteryCount {

    /**
     * Mapper which extracts the lottery number and passes it to the Reducer with a single occurrence
     */
    public static class LotteryMapper extends Mapper<Object, Text, IntWritable, IntWritable> {

        private final static IntWritable one = new IntWritable(1);
        private IntWritable lotteryKey;

        public void map(Object key, Text value, Context context) throws IOException, InterruptedException {

            StringTokenizer itr = new StringTokenizer(value.toString(), ",");
            while (itr.hasMoreTokens()) {
                lotteryKey.set(Integer.valueOf(itr.nextToken()));
                context.write(lotteryKey, one);
            }
        }
    }

    /**
     * Reducer to sum up the occurrence
     */
    public static class LotteryReducer
            extends Reducer<IntWritable, IntWritable, IntWritable, IntWritable> {
        IntWritable result = new IntWritable();

        public void reduce(IntWritable key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {
            int sum = 0;

            for (IntWritable val : values) {
                sum += val.get();
            }

            result.set(sum);
            context.write(key, result);
        }
    }
}

它實際上是來自官方 apache hadoop 文檔的字數,只是對我的數據集進行了一點定制。

我收到以下錯誤:

Caused by: java.lang.NumberFormatException: For input string: "2005-01-04"

我只是想計算每個抽獎號碼的出現次數。 如何通過使用我的代碼中的 StringTokenizer 來做到這一點? 我知道我必須拆分整行,因為標記器是“喂”整個行的。 我怎樣才能拿到彩票號碼,拆分它們然后計數?

先感謝您

第一個問題 - 在傳遞給 MapReduce 之前,您需要刪除文件的 header。

其次-您顯示的數據集中沒有逗號,因此不應將","提供給StringTokenizer 改用"\t"

下一個 - 並非所有令牌都是整數,因此盲目調用Integer.valueOf(itr.nextToken())將不起作用。 第一列是日期。 您可以在循環之前調用itr.nextToken()以丟棄日期,但是您需要在最后處理NULL

最終,映射器不需要解析任何東西。 您還可以在 reducer 中計算字符串。

我只是想計算每個抽獎號碼的出現次數。 如何通過使用我的代碼中的 StringTokenizer 來做到這一點? 我知道我必須拆分整行,因為標記器是“喂”整個行的。 我怎樣才能拿到彩票號碼,拆分它們然后計數?

您發布的數據樣本是制表符分隔的:

drawdate    lotterynumbers  meganumber  multiplier
2005-01-04  03 06 07 12 32  30            NULL
2005-01-07  02 08 14 15 51  38            NULL

這是一個簡單的例子,還有一些注意事項:

  • 這將示例數據的第一行用作line ,包括分隔數據字段的制表符,就像您發布的那樣。
  • 它使用一個StringTokenizer ,其標記分隔符定義為單個制表符 ( \t )
  • 程序調用hasMoreTokens()直到看到所有標記,並在此過程中打印每個標記。
  • output 包括左+右括號以顯示每個令牌的邊界。 例如,“30”有一個尾隨空格字符,如果不使用[]字符就不會被注意到,與“NULL”前面的前導空格相同。
String line = "2005-01-04   03 06 07 12 32  30            NULL";
StringTokenizer tokenizer = new StringTokenizer(line, "\t");

while (tokenizer.hasMoreTokens()) {
    String token = tokenizer.nextToken();
    System.out.println("token: [" + token + "]");
}

這是 output:

token: [2005-01-04 ]
token: [03 06 07 12 32 ]
token: [30 ]
token: [          NULL]

您可以采用這種方法,處理所有行,標記制表符,並使用第二個標記作為您的“彩票號碼”數據來做您喜歡的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM