关于上述主题,有没有办法从管道中获取字段的值。在Hadoop Cascading中使用管道范围之外的值?数据的分隔符为“|”:
first_name|description
Binod|nothing
Rohit|nothing
Ramesh|abc
从上面的管道我需要从描述中获取一个值,无论 'nothing' 或 'abc'
答案 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());
希望这有帮助。