我想使用mapreduce库来更新满足查询的所有实体。有几个复杂问题:
查找要更新的实体的查询将检查特定属性“property1”的值是否包含在csv文件中的一长串值(约10000个条目)中
对于满足查询的每个实体,另一个属性“property2”需要更新为等于csv文件第二列和同一行中的值
我知道如何将csv文件上传到blobstore,并使用blobstore输入读取器读取每一行。我还了解使用查询获取实体的数据存储输入读取器。
我的问题是如何创建一个Map器类,从blobstore读取输入数据,获取数据存储实体并尽可能高效地更新它们?
2条答案
按热度按时间p4tfgftt1#
考虑到property1的可能值列表很长,使用查询进行筛选似乎不是一个好的选择(因为您需要使用in-filter,它实际上为每个值运行一个查询)
使用mr的另一种方法是使用Map(从property1到property2)将csv加载到内存中,然后触发一个mr作业,该作业迭代所有实体,如果它们的property1是Map上的键的一部分,则使用Map值修改它。
正如@ryan b所说,如果你只是想利用批量卖出的优势,你不需要使用mr,因为你可以使用
Iterable
使用数据存储服务放置。9gm1akwq2#
您可以使用datastoreinputreader,在map函数中,找出属性1是否真的在csv中:每次从csv中读取都会非常慢,您可以使用memcache在从自己的数据存储模型中读取一次之后提供该信息。为了填充数据存储模型,我建议使用property1作为每一行的自定义id,这样查询它就很简单了。您只需要为那些实际更改的值更新数据存储,并使用变异池使其具有性能(op.db.put())。我给你留下伪代码(对不起。。。我只在python中有它)关于不同部分的外观,我进一步建议您阅读这篇关于google app engine上mapreduce的文章:http://sookocheff.com/posts/2014-04-15-app-engine-mapreduce-api-part-1-the-basics/