2014-11-11 12 views
-1

Я пытаюсь передать строку как значение в mapper, но получаю ошибку, что она не является Writable. Как разрешить?Как передать строку как значение в mapper?

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

    String TempString = value.toString(); 
    String[] SingleRecord = TempString.split("\t"); 

    //using Integer.parseInt to calculate profit 
    int Amount = Integer.parseInt(SingleRecord[7]); 
    int Asset = Integer.parseInt(SingleRecord[8]); 
    int SalesPrice = Integer.parseInt(SingleRecord[9]); 
    int Profit = Amount*(SalesPrice-Asset); 

    String ValueProfit = String.valueOf(Profit); 
    String ValueOne = String.valueOf(one); 

    custID.set(SingleRecord[2]); 
    data.set(ValueOne + ValueProfit); 
    context.write(custID, data); 

} 
+0

Что такое 'data' и что такое' custId'? –

ответ

0

учебник Yahoo говорит:
Объекты, которые могут быть маршалируются или из файлов и по сети должны соблюдать определенный интерфейс, называемый Writable, который позволяет Hadoop для чтения и записи данных в последовательную форму для передачи.

С сайта Cloudera:
ключ и значение классы должны быть сериализации в рамках и, следовательно, должны реализовывать интерфейс Writable. Кроме того, классы ключей должны реализовывать интерфейс WritableComparable для облегчения сортировки.

Для этого вам необходимо реализовать значение Writable, чтобы записать его в качестве значения в контексте. Hadoop поставляется с несколькими классами акций, такими как IntWritable. Обращаем внимание на то, что String аналогичен классу Text. Он может быть использован как:

context.write(custID, new Text(data)); 

ИЛИ

Text outValue = new Text(); 
val.set(data); 
context.write(custID, outValue) 

I случай, вам необходимо специализированные функции в классе значения, вы можете реализовать Writable (не большое дело после того, как все). Однако похоже, что Text вам просто.

+0

мы попробовали ваше предложение, но по-прежнему получаю сообщение об ошибке: Несколько маркеров на этой линии \t - Конструктор Text (IntWritable) не определено \t - метод записи (Text, TextWritable) в типе \t TaskInputOutputContext не применим для аргументов \t (Текст, текст) –

+0

Возможно, 'data' является' IntWritable'. Пожалуйста, поделитесь полным кодом своего «Mapper», чтобы получить быстрое решение. – blackSmith

+0

'public void map (LongWritable key, текстовое значение, контекст контекста) throws IOException, InterruptedException { String TempString = value.toString(); String [] SingleRecord = TempString.split ("\ t"); int Amount = Integer.parseInt (SingleRecord [7]); int Asset = Integer.parseInt (SingleRecord [8]); int SalesPrice = Integer.parseInt (SingleRecord [9]); int Profit = Amount * (SalesPrice-Asset); Строка ValueProfit = String.valueOf (Прибыль); String ValueOne = String.valueOf (один); custID.set (SingleRecord [2]); context.write (custID, новый Текст (данные)); } ' –

0

Вы не указали данные на карте в соответствии с импортированным текстом выше, а TextWritable ошибочен, просто используйте текст.

+0

Приветствуем вас в StackOverflow! Будет полезно предоставить фрагмент кода или пример (см. [Как ответить] (http://stackoverflow.com/help/how-to-answer)). –