[英]google appengine mapper - map over range of dates
我想使用appengine映射器来迭代日期范围(作为属性传递给配置的from-date和to-date)。 对于该范围内的每个日期,我将检索以该日期为属性的实体并对该集合进行操作。
例如,如果我具有以下一组实体:
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数据存储区时无需担心吗?
目前尚无法在App Engine的mapreduce实现中迭代给定类型的实体的子集。 如果实体在数据中占很大比例,则可以简单地遍历所有内容并忽略不需要的实体; 如果它们只占很小的比例,则您将不得不使用任务队列自行更新程序。
根据尼克·约翰逊的答案,您将需要使用自定义参数从上下文中检索日期范围。 然后,映射器会在处理之前过滤掉(忽略)超出范围的实体。
但是,如果您坚持要在给定种类的所有实体之间进行映射,则有一种变通办法,根据您的要求可能可行或不可行。 假设您对日期范围非常固定(听起来不太可能,但也许只是)。 然后,对于每个预期范围,您可以使用指向主实体的父键(或只是一个引用,但父键的一致性更好-考虑跨实体组的事务)创建对应的子实体类型。
因此,范围中的每个实体都会收到与该范围相对应的子实体。 然后,在与该范围相对应的子实体类型上设置一个映射器,并检索其父级进行处理。
在为“关系索引实体”模式填充数据时,我做了一些类似的工作,但方向相反,并且针对单个子实体。 因此,您的红利问题的答案-继续使用dao或您的数据层组成的任何内容。
尽管第一种方法较为合理,但是在您的范围不是非常动态和可管理的情况下,后者可能是可行的。 鉴于数据存储的无模式性质,创建新的实体类型既不昂贵也不是坏习惯。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.