Spark:在Java中的Dataset <t>上应用映射函数

时间:2018-06-21 06:22:13

标签: java apache-spark apache-spark-dataset

我有下面的代码可以与数据集上的foreach函数配合使用。finalJoinedDataFrame

    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>

有人可以在这里帮助吗?

1 个答案:

答案 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操作后将要返回的架构。