2016-02-16 2 views
2

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

first_name|description 

Binod|nothing 
Rohit|nothing 
Ramesh|abc 

Сверху трубы, мне нужно, чтобы получить значение из описания, что бы это не «ничего» или «а».

ответ

0

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

Если да, это то, что я бы сделал: реализуем function, который извлекает описание и выполняет его поток.

Вы функция (назовем его 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());

Надеется, что это помогает ,

+0

Спасибо за ответ, но мой вопрос: «Можем ли мы извлечь это описание за пределами трубы? По вышеуказанной функции описание извлекается, но все еще находится внутри трубы. Я хочу извлечь это описание и хочу использовать его как условие вне канала, например: if (description! = Null) {something;} (если мы не сможем извлечь причину?) – RaiBnod

+1

Я не думаю cascading поддерживает определение потока во время выполнения.Весь набор данных имеет один и тот же канал. Это, как говорится, может помочь фильтр. В определении потока вы можете иметь что-то вроде: 'Описание трубыNullPipe = new Каждый (inPipe, new CheckDescriptionIsNullFilter());' 'Описание трубыNotNullPipe = new Каждый (inPipe, new Not (новый CheckDescriptionIsNullFilter())); – chinglun

1

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

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

2

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

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

После кода и его выход показывает краткие подсказки:

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"); 

Ожидаемое Ouput:

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'] 
Смежные вопросы