在Hadoop Cascading中从管道外部的管道获取字段值

时间:2016-02-16 10:02:24

标签: hadoop cascading

关于上述主题,有没有办法从管道中获取字段的值。在Hadoop Cascading中使用管道范围之外的值?数据的分隔符为“|”:

first_name|description

Binod|nothing
Rohit|nothing
Ramesh|abc

从上面的管道我需要从描述中获取一个值,无论 'nothing' 'abc'

3 个答案:

答案 0 :(得分:2)

Hadoop Cascading的开发理念是通过在管道之间传输数据并在Map-Reduce Hadoop系统上并行执行来创建真实案例场景。

执行java程序不需要依赖于其他级联流(从创建源点击到接收点击),Hadoop Cascading所做的是:它在不同的独立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']

答案 1 :(得分:1)

我不明白你想说什么。您是指在管道范围之外提取字段${description}的值。如果可能的话,在伪代码中就是这样的。

str =获取 inputPipe 中的描述值(在作业范围内而不是函数或缓冲区)

答案 2 :(得分: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());

希望这有帮助。