我有下面的代码可以与数据集上的foreach
函数配合使用。finalJoined
是DataFrame
。
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
ClassTag<KieBase> classTagTest = scala.reflect.ClassTag$.MODULE$.apply(KieBase.class);
Broadcast<KieBase> broadcastRules = context.broadcast(kContainer.getKieBase("rules"), classTagTest);
Encoder<RuleParams> encoder = Encoders.bean(RuleParams.class);
Dataset<RuleParams> ds = new Dataset<RuleParams>(sparkSession, finalJoined.logicalPlan(), encoder);
System.out.println("Printing ruleParams DS");
ds.show();
ds.foreach(ruleParam -> droolprocess(broadcastRules.value(), ruleParam));
此处foreach
方法返回无效。
我需要Dataset<RuleParams>
作为返回值。下面是我的 droolprocess 方法,该方法调用规则引擎并更新 RuleParams 对象。
public static void droolprocess(KieBase base, RuleParams ruleParams) {
StatelessKieSession session = base.newStatelessKieSession();
session.execute(CommandFactory.newInsert(ruleParams));
System.out.println("After firing rules");
System.out.println(ruleParams.getPriceItemParam1());
System.out.println(ruleParams.getCisDivision());
}
我在stackoverflow和其他地方看到了一些问题,但是我不确定如何编写map
函数而不是foreach
来返回Dataset<RuleParams>
有人可以在这里帮助吗?
答案 0 :(得分:0)
您可以如下使用:
Dataset<RuleParams> ds = new Dataset<RuleParams>(sparkSession, finalJoined.logicalPlan(), encoder);
StructType schema = ds.schema();
ds = ds.map(ruleParams -> {
RuleParams theRuleParams= ruleParams;
...//your processing
return theRuleParams;
}, RowEncoder.apply(schema));
完成映射后,如果您在每行中添加/删除和修改数据,则需要通过创建每一行来返回行。
最后,应用回架构,以便数据集知道执行map
操作后将要返回的架构。