《调戏data mongodb 之 mapreduce》要点:
本文介绍了调戏data mongodb 之 mapreduce,希望对您有用。如果有疑问,可以联系我们。
《调戏data mongodb 之 mapreduce》是否对您有启发,欢迎查看更多与《调戏data mongodb 之 mapreduce》相关教程,学精学透。内存溢出PHP学院为您提供精彩教程。
今天主要介绍下在框架中如何使用mapreduce,不涉及到mapreduce的使用讲解
这边主要的Js代码都将写在Js文件中,放在classpath下面统一维护,修改起来也比较方便,如果直接用字符串拼接的方式在代码中,难看又难维护.
就算不用框架,就用驱动 *** 作mapreduce时,自己也可以将Js代码写在xml中,跟mybatis一样,然后写个工具类去读取即可.
MapReduceOptions options = MapReduceOptions.options();
options.outputCollection("Article_MapReduce");
options.outputTypeReduce();
options.finalizefunction("classpath:finalize.Js");
MapReduceResults<ValueObject> reduceResults =
mongoTemplate.mapReduce("article_info","classpath:map.Js",
"classpath:reduce.Js",options,ValueObject.class);
reduceResults.forEach(System.out::println);
outputCollection是指将结果输出某个集合中
finalizefunction是对应的finalize的Js函数代码
mapReduce有多个重载方法,下面可以看到有不同的参数,有可以指定输入集合名称的,也有直接传query的,用query意味着可以处理符合条件的一些数据,如果不指定query,那么将处理集合中的所有数据.
mongoTemplate.mapReduce(inputCollectionname,mapFunction,
reduceFunction,entityClass)
mongoTemplate.mapReduce(query,inputCollectionname,
mapFunction,reduceFunction,entityClass)
mongoTemplate.mapReduce(inputCollectionname,mapReduceOptions,entityClass)
前面说到对应的Js代码我们是写在文件中,然后调用的时候传这个文件的名称,框架自己回去加载对应的Js代码,我们从源码中可以看到有读取Js代码的方法.
public <T> MapReduceResults<T> mapReduce(query query,String inputCollectionname,String mapFunction,
String reduceFunction,MapReduceOptions mapReduceOptions,Class<T> entityClass) {
String mapFunc = replaceWithResourceIfNecessary(mapFunction);
String reduceFunc = replaceWithResourceIfNecessary(reduceFunction);
DBCollection inputCollection = getCollection(inputCollectionname);
MapReduceCommand command = new MapReduceCommand(inputCollection,mapFunc,reduceFunc,
mapReduceOptions.getoutputCollection(),mapReduceOptions.getoutputType(),
query == null || query.getqueryObject() == null ? null
: queryMapper.getMappedobject(query.getqueryObject(),null));
protected String replaceWithResourceIfNecessary(String function) {
String func = function;
if (this.resourceLoader != null && ResourceUtils.isUrl(function)) {
Resource functionResource = resourceLoader.getResource(func);
if (!functionResource.exists()) {
throw new InvalIDDataAccessAPIUsageException(String.format("Resource %s not found!",function));
}
Scanner scanner = null;
try {
scanner = new Scanner(functionResource.getinputStream());
return scanner.useDelimiter("\\A").next();
} catch (IOException e) {
throw new InvalIDDataAccessAPIUsageException(String.format("Cannot read map-reduce file %s!",function),e);
} finally {
if (scanner != null) {
scanner.close();
}
}
}
return func;
}
下面贴出今天测试的Js代码,按文章的作者统计文章的次数
map.Js
function() {
emit(this.author,1);
}
reduce.Js
function(key,values) {
var sum = 0;
for (var i = 0; i < values.length; i++)
sum += values[i];
return sum;
}
finalize.Js
function(key,reduce) {
return reduce;
}
finalize中没有去格式化输出的格式,所以输出的格式是原始的格式
{ "_ID" : "文章作者","value" : 文章次数 }
上面的调用代码中虽然指定了输出结果的集合名称,但还是定义了ValueObject来接收返回值,那么ValueObject的格式肯定也是ID和value.
public class ValueObject {
private String ID;
private Integer value;
public String getID() {
return ID;
}
public voID setID(String ID) {
this.ID = ID;
}
public Integer getValue() {
return value;
}
public voID setValue(Integer value) {
this.value = value;
}
@OverrIDe
public String toString() {
return "ValueObject [ID=" + ID + ",value=" + value + "]";
}
}
在库中查询的原始数据格式如下
> db.Article_MapReduce.find();
{ "_ID" : "jason","value" : 1 }
{ "_ID" : "mk","value" : 1 }
{ "_ID" : "yinjihuan","value" : 18 }
>
源码下载:https://github.com/yinjihuan/cxytiandi
总结以上是内存溢出为你收集整理的调戏data mongodb 之 mapreduce全部内容,希望文章能够帮你解决调戏data mongodb 之 mapreduce所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)