【发布时间】:2015-01-15 07:22:34
【问题描述】:
我想使用 mapreduce 库来更新所有满足查询的实体。有几个并发症:
- 查找要更新的实体的查询检查是否存在 特定属性“property1”包含在一个长长的值列表中(~10000 条目)来自 csv 文件
- 对于每个满足查询的实体,需要将另一个属性“property2”更新为等于 csv 文件第二列和同一行中的值
我知道如何将 csv 文件上传到 Blobstore 并使用 Blobstore 输入阅读器读取每一行。我也知道使用查询获取实体的 Datastore 输入阅读器。
我的问题是如何创建一个从 Blobstore 读取输入数据、获取数据存储实体并尽可能高效地更新它们的 Mapper 类?
【问题讨论】:
-
我怀疑 map-reduce 能否提供您想要的性能。通常 map-reduce 对可以自然分解的数据进行操作;但在您的情况下,由于您正在使用 CSV 文件,因此使用的大部分时间和内存将用于将该 CSV 文件解析为多行(多个字符串);或者,如果您将该 CSV 字符串视为单个流,那么您会被 readLine() 的串行操作阻止。由于与任务划分的成本相比,您的处理并不耗时(如果不是,请纠正我),我认为 map reduce 不会在任何方面为您带来好处。
-
我希望至少从批量获取和放入数据存储中受益,因为替代方法是获取每个完整的实体,更改属性并放回数据存储。
-
虽然 map-reduce,MR,非常适合在许多实体上工作,但它还需要处理 csv 可能会减慢速度。一种选择是将 CSV 也加载到数据存储中,对所有实体执行 MR,然后在映射器中对 CSV 类型执行 .get 以查看传递的实体是否存在。如果是更新,则跳过。不是最好的方法,但我能想到的唯一方法。仅供参考,您可以使用 put_multi 进行批处理cloud.google.com/appengine/docs/python/ndb/functions
-
这应该可以帮助你。 ikaisays.com/2010/08/11/…
-
@Sridhar,该教程只是根据 CSV 中的信息创建新实体。就我而言,我需要找到与 CSV 的每一行对应的现有数据存储实体并对其进行更新。那么,我应该查询数据存储区约 10,000 次以获取每行的实体还是有更好的方法?
标签: java google-app-engine mapreduce google-cloud-datastore blobstore