我想使用 mapreduce 库来更新满足查询的所有实体。有几个并发症:
- 查找要更新的实体的查询检查 a 的值是否 特定属性“property1”包含在一长串值中(~10000 条目)来自 csv 文件
- 对于满足查询的每个实体,需要更新另一个属性“property2”,使其等于 csv 文件同一行第二列中的值
我知道如何将 csv 文件上传到 Blobstore 并使用 Blobstore 输入阅读器读取每一行。我还知道使用查询获取实体的数据存储输入读取器。
我的问题是如何创建一个 Mapper 类来尽可能高效地从 Blobstore 读取输入数据、获取数据存储实体并更新它们?
请您参考如下方法:
鉴于 property1 的可能值列表很长,使用查询来过滤似乎不是一个好的选择(因为您需要使用 IN 过滤器,实际上是 runs one query per value )
使用 MR 的另一种方法是使用 Map(从 property1 到 property2)将 CSV 加载到内存中,然后触发一个迭代所有实体的 MR 作业,如果他们的 property1 是 map 上键的一部分,则使用映射值修改它。
正如@Ryan B 所说,如果您只想利用批量放置,则不需要为此使用 MR,因为您可以使用 DatastoreService 使用 Iterable
到 put。