[英]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()
直到看到所有標記,並在此過程中打印每個標記。[]
字符就不會被注意到,與“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.