2011-01-25 7 views
7

App Engineのデータストアに重複した要素がいくつかあります(行全体ではなく、そのほとんどのフィールド)。アプリケーションエンジンのデータストアで重複を見つける

どのような方法でそれらを見つけるのですか?

私は整数と文字列フィールドの両方が複製されています(比較する場合はもう一方が高速です)。

ありがとうございます!

答えて

6

愚かですばやいアプローチは、気になるフィールドを取り出し、長い文字列として連結し、元のエンティティを参照するDB_Uniqueエンティティのキ​​ーとして保存することです。 DB_Unique.get_or_insert()を実行するたびに、参照が正しい元のエンティティへの参照であることを確認する必要があります。そうでない場合は、複製があります。これは、おそらくmap reduceで行う必要があります。

ような何か:

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 

忍び寄るかもしれないエッジケースのカップルは(「「A_B」」)あなたはBと等しくCとの2つのエンティティを持っている場合など、ありと(」 a '、' b_ ')となるので、連結は' a_b_ 'になります。だからあなたの文字列には '_'ではなく、DB_Unique.rを参照のリストにしてそれらのすべてを比較することがわかっている文字を使用してください。

+0

それはかなりきちんとした解決策です、間違いなく+1 – systempuntoout

1

これが一度だけである場合や、めったに発生しない場合は、データベース全体をローカルマシンにダンプすることができます。uploading and downloading dataを参照してください。sqlite3データベースにデータをロードし、重複するキーを探します。

これをGAE側でプログラムで実行しようとすると、かなり面倒なことがあります。 のタスクは完全に実行可能ですが、あまりにも簡単なものはありません。

+0

私は35K以上のレコードを持っています。私はそのことがほんの一度のことであると願っています。 – ana