Java 如何修改此Mapreduce代码以同时更改实体';名称空间?

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

我正在使用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.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()
。创建实体时,将隐式使用当前名称空间。看见