Получение значения поля из канала за пределами канала в Hadoop Cascading

Что касается вышеуказанной темы, есть ли способ получить значение поля из канала. И использовать это значение вне области действия канала в Hadoop Cascading? Данные имеют разделитель в виде «|»:

first_name|description

Binod|nothing
Rohit|nothing
Ramesh|abc

Из приведенного выше канала мне нужно получить значение из описания, что бы это ни было: 'ничего' или 'abc'.


person RaiBnod    schedule 16.02.2016    source источник


Ответы (3)


Hadoop Cascading разработан с концепцией создания сценария реального случая путем передачи данных между каналами и их параллельного выполнения в системе Map-Reduce Hadoop.

Выполнение java-программы не должно зависеть от остальной части каскадного потока (от создания исходного отвода до отвода приемника), и что делает каскадирование Hadoop: он выполняет эти два разных процесса в разных независимых экземплярах JVM и они не смогут разделить свои ценности.

Следующий код и его вывод показывают краткие подсказки:

System.out.println("Before Debugging");
m_eligPipe = new Each(m_eligPipe, new Fields("first_name"), new Debug("On Middle", true));
System.out.println("After Debugging");

Ожидаемый результат:

Before Debugging
On Middle: ['first_name']
On Middle: ['Binod']
On Middle: ['Rohit']
On Middle: ['Ramesh']
After Debugging

Фактический результат:

Before Debugging
After Debugging
...
...
On Middle: ['first_name']
On Middle: ['Binod']
On Middle: ['Rohit']
On Middle: ['Ramesh']
person Community    schedule 03.03.2016

Я не понимаю, что ты пытаешься сказать. Вы имеете в виду извлечь значение поля ${description} за пределы канала. Если возможно что-то подобное в псевдокоде.

str = получить значение описания в inputPipe (которое находится в области задания, а не в функции или буфере)

person Ritesh Shakya    schedule 02.03.2016

Я предполагаю, что это то, что вам нужно: у вас есть канал с одним полем, то есть конкатенацией ${first_name} и ${description}. И вы хотите, чтобы на выходе был канал с полем ${description}.

Если да, то я бы сделал следующее: реализовал функцию, который извлекает описание и выполняет его.

Ваша функция (назовем ее ExtractDescriptionFunction) должна переопределить метод, работающий примерно так:

@Override
public void operate(FlowProcess flowProcess, FunctionCall<Tuple> functionCall) {
  TupleEntry arguments = functionCall.getArguments();

  String concatenation = arguments.getString("$input_field_name");
  String[] values = concatenation.split("\\|"); // you might want to have some data sanity check here
  String description = values[1];

  Tuple tuple = functionCall.getContext();
  tuple.set(0, description);
  functionCall.getOutputCollector().add(tuple);
}

Затем в определение потока добавьте следующее:

Pipe outputPipe = new Each(inputPipe, new ExtractDescriptionFunction());

Надеюсь это поможет.

person chinglun    schedule 20.02.2016
comment
Спасибо за ответ, но мой вопрос: можем ли мы извлечь это описание за пределы канала? С помощью вышеуказанной функции описание извлекается, но оно все еще находится внутри канала. Я хочу извлечь это описание и использовать его как условие вне канала, например: if(description!=null){something;} (если мы не можем извлечь, в чем причина?). - person RaiBnod; 22.02.2016
comment
Я не думаю, что каскадирование поддерживает определение потока во время выполнения. Весь набор данных использует один и тот же канал. При этом, что может помочь, так это фильтр. В определении потока у вас может быть что-то вроде: Pipe descriptionNullPipe = new Each(inPipe, new CheckDescriptionIsNullFilter()); Pipe descriptionNotNullPipe = new Each(inPipe, new Not(new CheckDescriptionIsNullFilter())); - person chinglun; 22.02.2016