Ich verwende appengine-mapreduce dafür. Ich werde nicht darauf eingehen, es im Detail aufzustellen. Sie können die getting started guides für diese Information lesen.
Gerade jetzt müssen Sie jeden Klassennamen eingeben kopiert werden. TODO stellt fest, wie man alle __Stat_Kind__ Ergebnisse programmatisch überschleifen kann, so dass jede Art/Klasse nicht separat spezifiziert werden muss.
import java.util.logging.Logger;
import org.apache.hadoop.io.NullWritable;
import com.google.appengine.api.NamespaceManager;
import com.google.appengine.api.datastore.DatastoreService;
import com.google.appengine.api.datastore.DatastoreServiceFactory;
import com.google.appengine.api.datastore.Entity;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.KeyFactory;
import com.google.appengine.tools.mapreduce.AppEngineMapper;
public class DatastoreCopyMapper extends
AppEngineMapper<Key, Entity, NullWritable, NullWritable> {
private static final Logger log = Logger
.getLogger(DatastoreCopyMapper.class.getName());
private static String destination;
public DatastoreCopyMapper() {
}
@Override
public void taskSetup(Context context) {
log.warning("Doing per-task setup");
destination = context.getConfiguration().get("destination");
log.warning("destination: " + destination);
}
@Override
public void map(Key key, Entity value, Context context) {
NamespaceManager.set(destination);
String name = key.getName();
long id = key.getId();
Key destinationKey = null;
if (name != null) {
destinationKey = KeyFactory.createKey(key.getKind(), name);
} else if (id != 0) {
destinationKey = KeyFactory.createKey(key.getKind(), id);
}
Entity destinationEntity = new Entity(destinationKey);
destinationEntity.setPropertiesFrom(value);
DatastoreService datastore = DatastoreServiceFactory
.getDatastoreService();
datastore.put(destinationEntity);
}
}
mapreduce.xml
<configurations>
<configuration name="Copy between namespaces">
<property>
<name>mapreduce.map.class</name>
<value>com.mysite.server.DatastoreCopyMapper</value>
</property>
<property>
<name>mapreduce.inputformat.class</name>
<value>com.google.appengine.tools.mapreduce.DatastoreInputFormat</value>
</property>
<property>
<name human="Entity Kind to Map Over">mapreduce.mapper.inputformat.datastoreinputformat.entitykind</name>
<value template="optional">User</value>
</property>
<property>
<name human="Destination Namespace">mapreduce.mapper.inputformat.datastoreinputformat.destination</name>
<value template="optional">dev.mysite.com</value>
</property>
</configuration>
</configurations>
Glauben Sie, dass der RAS-API Sie bei diesem Unterfangen helfen kann? Sie müssen das Python-SDK herunterladen, aber Sie können es für Ihre Java-Anwendung einrichten. Ich habe gerade dieses Kapitel in "Programmieren von Google App Engine" gestern über Bulk-Datenoperationen und Fernzugriff gelesen: http://my.safaribooksonline.com/web-development/9780596157517/bulk-data-operations-and-remote- access/using_the_remote_api_from_a_script # X2ludGVybmFsX0ZsYXNoUmVhZGVyP3htbGlkPTk3ODA1OTYxNTc1MTcvMjc3 –
Ja, meine Annahme ist die remote_api und ihre Massendatenoperationen müssen verwendet werden, ich weiß einfach nicht wie und will das Rad nicht neu erfinden. –
Wenn Sie den Bulk Loader-Ansatz verwenden möchten, müssen Sie auch eine Python-Instanz Ihrer App hochladen. Docs sind hier: http://code.google.com/appengine/docs/python/tools/uploadingdata.html –