Java 如何修改此Mapreduce代码以同时更改实体';名称空间?
我正在使用Ikai Lan创建的映射器:Java 如何修改此Mapreduce代码以同时更改实体';名称空间?,java,google-app-engine,mapreduce,Java,Google App Engine,Mapreduce,我正在使用Ikai Lan创建的映射器: package com.ikai.mapperdemo.mappers; import java.util.Date; import java.util.logging.Logger; import org.apache.hadoop.io.NullWritable; import com.google.appengine.api.datastore.Entity; import com.google.appengine.api.datastore
package com.ikai.mapperdemo.mappers;
import java.util.Date;
import java.util.logging.Logger;
import org.apache.hadoop.io.NullWritable;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.tools.mapreduce.AppEngineMapper;
import com.google.appengine.tools.mapreduce.DatastoreMutationPool;
/**
*
* The functionality of this is exactly the same as in {@link NaiveToLowercaseMapper}.
* The advantage here is that since a {@link DatastoreMutationPool} is used, mutations
* can be done in batch, saving API calls.
*
* @author Ikai Lan
*
*/
public class PooledToLowercaseMapper extends
AppEngineMapper<Key, Entity, NullWritable, NullWritable> {
private static final Logger log = Logger
.getLogger(PooledToLowercaseMapper.class.getName());
@Override
public void map(Key key, Entity value, Context context) {
log.info("Mapping key: " + key);
if (value.hasProperty("comment")) {
String comment = (String) value.getProperty("comment");
comment = comment.toLowerCase();
value.setProperty("comment", comment);
value.setProperty("updatedAt", new Date());
DatastoreMutationPool mutationPool = this.getAppEngineContext(
context).getMutationPool();
mutationPool.put(value);
}
}
}
package com.ikai.mapperdemo.mappers;
导入java.util.Date;
导入java.util.logging.Logger;
导入org.apache.hadoop.io.NullWritable;
导入com.google.appengine.api.datastore.Entity;
导入com.google.appengine.api.datastore.Key;
导入com.google.appengine.tools.mapreduce.AppEngineMapper;
导入com.google.appengine.tools.mapreduce.DatastoreMutationPool;
/**
*
*它的功能与{@link NaiveToLowercaseMapper}中的功能完全相同。
*这里的优点是,由于使用了{@link DatastoreMutationPool},因此
*可以批量完成,节省API调用。
*
*@作者伊凯兰
*
*/
公共类PooledToLowercaseMapper扩展
AppEngineMapper{
专用静态最终记录器日志=记录器
.getLogger(PooledToLowercaseMapper.class.getName());
@凌驾
公共无效映射(键、实体值、上下文){
log.info(“映射键:+键”);
if(value.hasProperty(“注释”)){
字符串注释=(字符串)value.getProperty(“注释”);
comment=comment.toLowerCase();
value.setProperty(“注释”,注释);
setProperty(“updatedAt”,new Date());
DatastoreMutationPool mutationPool=this.getAppEngineContext(
getMutationPool();
mutationPool.put(值);
}
}
}
除了上述内容之外,我还想更改正在修改的实体的数据存储名称空间
这怎么可能呢?名称空间是实体不可变键的一个组件。没有改变它的想法。如果您试图将一个实体“移动”到另一个命名空间中,则需要在该命名空间中创建一个新实体,跟踪对旧实体的所有引用并进行更新,然后删除旧实体。Ok。很高兴知道。但我真正的问题是,我不知道如何在这个MapReduce代码的上下文中在特定名称空间中创建实体。例如,我可以这样做:
entitynewone=newentity(“Kind”,id)
创建一个新实体-但我不知道如何设置它的名称空间
。有一个getNamespace
方法,但没有setNamespace
?NamespaceManager
是否可以在此处设置名称空间?NamespaceManager
是您需要的。它有一个.get()
和一个.set()
。创建实体时,将隐式使用当前名称空间。看见