如何获得原始字段的完整列表以及在三叉戟中修改过的新字段?

时间:2013-11-11 12:29:36

标签: apache-storm trident

假设我有字段列表,即{field1,field2,field3,field4} 我在field2上执行了一些操作,说我想将每个元组值增加一些值,比如5,

performed this operation in a function which gave me modified field with "M_field2" as out field name now i want to write complete tuple in a file but in place of field2 i want "M_field2". How i will achieve this.

2 个答案:

答案 0 :(得分:1)

从它所说的trident API page

  

函数接受一组输入字段并发出零个或多个元组作为输出。 输出元组的字段将附加到流中的原始输入元组。如果函数没有发出元组,则会过滤掉原始输入元组。否则,为每个输出元组重复输入元组

现在从trident tutorial page中挖掘出更多内容 对于分组流,输出将包含分组字段,后跟聚合器发出的字段。例如:

    stream.groupBy(new Fields("val1"))
     .aggregate(new Fields("val2"), new Sum(), new Fields("sum"))

在此示例中,输出将包含字段"val1" and "sum"

我不确定,但我能想到的最接近的是做

之类的事情
    stream.groupBy(new Fields("field1","field3","field4"))
     .aggregate(new Fields("field2"), new Sum(), new Fields("M_field2"))

可能会实现您的目标。如果我错了,请纠正我。

答案 1 :(得分:1)

我解决了这个问题..使用trident只需要在输入字段列表中使用修改后的字段名称。 例如: -

topology.newStream("dummySpout",new DummySpout()).stateQuery(tridentState, new QueryFunctionClass(), new Fields("outLpi","outFileId"))
.each(new Fields("outLpi"),new DBReaderFunction((ArrayList<String>)conf.get("listOfFields")), new Fields((ArrayList<String>)conf.get("listOfFields")))
.each(new Fields((ArrayList<String>)conf.get("listOfFields")), new LoggerFilter())
.aggregate(new Fields("SAL"), new ApplyAggregator(),new Fields("sum"))
.each(new Fields("sum","SAL"),new LoggerFilter());

在最后一行“sum”是修改后的字段,SAL是原始字段。