Привет, я новичок в Hadoop. Я застрял в той точке, где я понятия не имею, что я делаю неправильно.Я пытаюсь разобрать простое двойное значение в DoubleWritable из Hadoop, но это дает мне 0,0.
0.0 Southwest
0.0 US Airways
0.0 United
0.0 Virgin America
Ниже я пытаюсь сделать следующее:
double negativeWords = 0;
for(DoubleWritable value : values) {
if(value.get() < 0) {
negativeWords = negativeWords + 1;
}
}
logger.info("NEGATIVE WORDS: " +negativeWords + " KEY: " + key);
context.write(key, new DoubleWritable(negativeWords));
Класс Mapper
public class USAirlineComparisionMapper extends Mapper<LongWritable, Text, Text, DoubleWritable> {
private Logger logger = Logger.getLogger(USAirlineComparisionMapper.class);
private final static DoubleWritable tempResult = new DoubleWritable();
private Text tempAirline = new Text();
private Set<String> negativeSet;
private Set<String> positiveSet;
@Override
protected void setup(Context context)
throws IOException, InterruptedException {
Configuration conf = context.getConfiguration();
negativeSet = new HashSet<String>();
positiveSet = new HashSet<String>();
for(String negWord : conf.get("negativewords").split(",")) {
negativeSet.add(negWord);
}
for(String posWord : conf.get("positivewords").split(",")) {
positiveSet.add(posWord);
}
}
@Override
protected void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
double positiveWords = 0;
double negativeWords = 0;
double otherWords = 0;
double result = 0;
try {
String[] row = value.toString().split(",");
String tweet = row[10];
tempAirline.set(row[5]);
String[] splitedTweet = tweet.split(" ");
for(int i = 0; i < splitedTweet.length; i++) {
if(splitedTweet[i] != " ") {
if(negativeSet.contains(splitedTweet[i].trim().replaceAll("[^a-zA-Z0-9]", ""))) {
negativeWords++;
}else if(positiveSet.contains(splitedTweet[i].trim().replaceAll("[^a-zA-Z0-9]", ""))) {
positiveWords++;
}else {
otherWords++;
}
}
}
try {
result = (positiveWords - negativeWords)/(positiveWords + negativeWords + otherWords);
logger.info("$$$$$$$$$$$$$$$$$$$$$$$$$$");
logger.info("RESULT: " +result );
logger.info("$$$$$$$$$$$$$$$$$$$$$$$$$$");
}catch(ArithmeticException e) {
result = 1;
}
tempResult.set(Math.round(result * 100.0) /100.0);
/*logger.info("==============================================");
logger.info("result : " + result);
logger.info("==============================================");*/
context.write(tempAirline, tempResult);
}catch(Exception e) {
logger.error(" ", e);
}
}
}
Самая интересная часть в моем журнале, я получаюжелаемый результат:
ОТРИЦАТЕЛЬНЫЕ СЛОВА: 345.0. КЛЮЧ: Дельта ОТРИЦАТЕЛЬНЫЕ СЛОВА: 293.0. КЛЮЧ: Юго-Запад. ОТРИЦАТЕЛЬНЫЕ СЛОВА: 19.0. КЛЮЧ: US Airways. ОТРИЦАТЕЛЬНЫЕ СЛОВА: 650.0.Америка