У меня есть пакетное задание в Scala / Spark, которое динамически создает правила Drools в зависимости от некоторого ввода и затем оценивает правила.У меня также есть входные данные RDD[T]
, которые соответствуют фактам, которые должны быть вставлены в механизм правил.
Пока что я вставляю факты по одному, а затем запускаю все правила по этому факту.Я делаю это, используя rdd.aggregate
.
Оператор seqOp определяется следующим образом:
/**
* @param broadcastRules the broadcasted KieBase object containing all rules
* @param aggregator used to accumulate values when rule matches
* @param item the fact to run Drools with
* @tparam T the type of the given item
* @return the updated aggregator
*/
def seqOp[T: ClassTag](broadcastRules: Broadcast[KieBase])(
aggregator: MyAggregator,
item: T) : MyAggregator = {
val session = broadcastRules.value.newStatelessKieSession
session.setGlobal("aggregator", aggregator)
session.execute(CommandFactory.newInsert(item))
aggregator
}
Вот пример сгенерированного правила:
dialect "mvel"
global batch.model.MyAggregator aggregator
rule "1"
when condition
then do something on the aggregator
end
Для того же СДР пакету потребовалось 20 минут, чтобы оценить правила 3К, но 10 часов, чтобы оценить правила 10К!
Мне интересно, является ли вставка факта фактом лучшим подходом.Лучше ли сразу вставлять все элементы СДР, чем запускать все правила?Это не кажется мне оптимальным, так как все факты будут в рабочей памяти одновременно.
Видите ли вы какие-либо проблемы с кодом выше?