2011-09-11 3 views
0

내가 Ikai 란 만든이 매퍼를 사용하고 있습니다 :또한이 Mapreduce 코드를 수정하여 엔터티의 네임 스페이스를 변경하려면 어떻게해야합니까?

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); 
     } 
    } 
} 

내가 또한 수정되는 엔티티의 데이터 저장소 네임 스페이스를 변경하는 위에 추가하고 싶은.

어떻게 가능합니까?

답변

2

네임 스페이스는 Entity의 변경 불가능한 키의 구성 요소입니다. 그것을 바꾸는 개념은 없습니다. 엔티티를 다른 네임 스페이스로 '이동'하려는 경우 해당 네임 스페이스에 새 엔티티를 만들고 이전 엔티티에 대한 참조를 추적하여 업데이트 한 다음 이전 엔티티를 삭제해야합니다.

+0

확인. 알아 둘만한. 그러나 실제 문제는이 MapReduce 코드 **의 컨텍스트에서 특정 네임 스페이스 **에서 엔티티를 만드는 방법을 모르겠다는 것입니다. 예를 들어, 다음과 같이 할 수 있습니다 :'Entity newOne = new Entity ("Kind", id);'새로운 엔티티를 생성하려면 -'네임 스페이스를 설정하는 방법을 모르겠습니다 .' 'getNamespace' 메소드는 있지만'setNamespace'는 없습니까? 네임 스페이스를 설정하기 위해'NamespaceManager'가 여기서 작동할까요? – Beatboxer

+1

네임 스페이스 매니저가 필요합니다. '.get()'과'.set()'을 모두 가지고 있습니다. 엔티티가 생성되면 현재 네임 스페이스가 암시 적으로 사용됩니다. http://code.google.com/appengine/docs/java/javadoc/com/google/appengine/api/NamespaceManager.html을 참조하십시오. –

관련 문제