我想使用appengine映射器迭代一系列日期(从日期和到目前为止的属性传递到配置)。对于范围中的每个日期,我将检索具有此日期作为属性的实体并对此集合进行操作。
例如,如果我有以下一组实体:
Key Date Value
a 2011/09/09 323
b 2011/09/09 132
c 2011/09/08 354
d 2011/09/08 432
e 2011/09/08 234
f 2011/09/07 423
g 2011/09/07 543
我想指定2011/09/09 - 2011/09/07的日期范围,这将为2011/09/09,2011 / 09/08和2011/09/07创建三个映射器实例。反过来,这些将分别查询实体a + b,c + d + e和f + g,并对值执行一些操作。 (每个映射器也会对其他数据进行其他数据存储查询,因此下面是“红利问题”)
大概我需要创建一个自定义InputFormat
类,但是我对mapreduce / hadoop很新,我希望有人有一些例子吗?
奖金问题:使用dao在映射器中加载数据是“糟糕的形式”吗?我使用过的其他分布式计算平台(例如DataSynapse)要求您将所有输入包裹起来并提供任务以防止对数据服务器进行过多争用。但是,对于appengine HR数据存储区,我认为这不是一个问题吗?
答案 0 :(得分:1)
目前无法在App Engine的mapreduce实现中迭代给定类型的实体子集。如果实体构成了大部分数据,您可以简单地迭代所有内容并忽略不需要的实体;如果它们只构成一小部分,则必须使用任务队列滚动自己的更新过程。
答案 1 :(得分:0)
根据Nick Johnson的回答,您需要使用自定义参数从上下文中检索日期范围。然后映射器在处理之前过滤掉(忽略)超出范围的实体。
但是,如果您坚持在给定类型的所有实体之间进行映射,那么根据您的要求可能会或可能不可行的解决方案。假设您在日期范围内非常固定(听起来不太可能,但可能只是)。然后,对于每个预期范围,您使用父键创建相应的子实体种类(或仅使用引用,但父键更好地实现一致性 - 认为跨实体组的事务)指向主实体。
因此,该范围内的每个实体都接收与该范围对应的种类的子实体。然后在与该范围对应的子实体类上设置映射器并检索其父级以对其进行处理。
在填充关系索引实体模式的数据时,我做了一些相似但相反的方向和单个子实体类型。因此,您的奖金问题的答案 - 继续使用dao或您的数据层所包含的任何内容。
虽然第一种方法更有声音,但后者在您的范围不是非常动态且易于管理的情况下可能是可行的。鉴于数据存储区的无模式特性,创建新的实体种类既不昂贵也不是不好的做法。