I DISTRIBUTEd by ID as suggested in option B, I realized that I could do it at splitData level before the JOIN and from there on use the option LOCAL in all operations. 

  
EXPORT ClassifyD(DATASET(Types.DiscreteField) Indep,DATASET(Types.NumericField) mod) := FUNCTION
	ML.FromField(mod, Trees.gSplitF, nodes, model_Map);	// need to use model_Map previously build when Learning (ToField)
	leafs := nodes(new_node_id = 0);	// from final nodes
	splitData_raw:= Trees.gSplitInstances(nodes, Indep);
	splitData:= DISTRIBUTE(splitData_raw, id);
	l_result final_class(RECORDOF(splitData) l, RECORDOF(leafs) r ):= TRANSFORM
		SELF.id     := l.id;
		SELF.number := 1;
		SELF.value  := r.value;
		SELF.conf   := 0;		// store percentaje of voting over total number of trees
		SELF.closest_conf:= 0;	// added to fit in l_result, not used so far
	END;
	gClass:= JOIN(splitData, leafs, LEFT.new_node_id = RIGHT.node_id AND LEFT.group_id = RIGHT.group_id, final_class(LEFT, RIGHT), LOOKUP, LOCAL);
	accClass:= TABLE(gClass, {id, number, value, cnt:= COUNT(GROUP)}, id, number, value, LOCAL);
	sClass := SORT(accClass, id, -cnt, LOCAL);
	finalClass:=DEDUP(sClass, id, LOCAL);
	RETURN PROJECT(finalClass, TRANSFORM(l_result, SELF.conf:= LEFT.cnt/treeNum, SELF:= LEFT, SELF:=[]), LOCAL);
END;