2011-01-25 15 views
7

Tengo algunos elementos duplicados en mi almacén de datos (no toda la fila, pero sí la mayoría de los campos) en App Engine.Buscar duplicados en el almacén de datos del motor de aplicaciones

¿Cuál es la mejor manera de encontrarlos?

Tengo campos enteros y de cadena que están duplicados (en caso de que comparar uno sea más rápido que el otro).

Gracias!

Respuesta

6

Un enfoque estúpido pero rápido sería tomar los campos que te interesan, concatenarlos como una cadena larga y almacenarlos como la clave de una entidad DB_Unique que hace referencia a la entidad original. Cada vez que haga DB_Unique.get_or_insert(), debe verificar que la referencia es a la entidad original correcta; de lo contrario, tiene un duplicado. Esto probablemente debería hacerse en un map reduce.

Algo así como:

class DB_Unique(db.Model): 
    r = db.ReferenceProperty() 

class DB_Obj(db.Model): 
    a = db.IntegerProperty() 
    b = db.StringProperty() 
    c = db.StringProperty() 

# executed for each DB_Obj... 
def mapreduce(entity): 
    key = '%s_%s_%s' % (entity.a,entity.b,entity.c) 
    res = DB_Unique.get_or_insert(key, r=entity) 
    if DB_Unique.r.get_value_for_datastore(res) != entity.key(): 
    # we have a possible collision, verify and delete? 
    # out two entities are res and entity 

Hay un par de casos extremos que pueden arrastrarse para arriba, como si tiene dos entidades con byc igual a ('A_B', '') y (' a ',' b_ ') respectivamente, por lo que la concatenación es' a_b_ 'para ambos. por lo tanto, utilice un carácter que sepa que no está en sus cadenas en lugar de '_', o haga que DB_Unique.r sea una lista de referencias y compárelas todas.

+0

esa es una solución bastante buena, definitivamente +1 – systempuntoout

1

Si se trata de una ocasión excepcional o de una vez, puede intentar descargar toda la base de datos en la máquina local; consulte uploading and downloading data - cargue los datos en una base de datos sqlite3 y encuentre las claves duplicadas.

Intentar hacer esto programáticamente por el lado de GAE puede resultar bastante tedioso. Con tareas totalmente factibles pero no demasiado fáciles.

+0

Tengo más de 35K registros y espero que sea una sola vez. – ana

Cuestiones relacionadas