【问题标题】:google appengine mapper - map over range of datesgoogle appengine mapper - 映射日期范围
【发布时间】:2011-10-04 16:34:18
【问题描述】:

我想使用 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 数据存储,我认为这不是问题?

【问题讨论】:

    标签: java google-app-engine hadoop


    【解决方案1】:

    目前无法在 App Engine 的 mapreduce 实现中迭代给定类型的实体子集。如果实体占数据的很大一部分,您可以简单地迭代所有内容并忽略不需要的实体;如果他们只占一小部分,你将不得不使用任务队列滚动你自己的更新过程。

    【讨论】:

    • 嗨尼克,感谢您的回答,但我认为我的问题不够清楚。我已经在上面进行了编辑,并将感谢您的想法。干杯,马克
    • @MarkNuttall-Smith 您的问题仍然假定能够在某种实体的子集上运行映射器,但这是不可能的。
    【解决方案2】:

    根据 Nick Johnson 的回答,您需要使用自定义参数从上下文中检索您的日期范围。然后映射器在处理之前过滤掉(忽略)超出范围的实体。

    但是,如果您坚持跨给定类型的所有实体进行映射,那么有一个变通解决方案,根据您的要求可能可行,也可能不可行。假设您对日期范围非常固定(听起来不太可能,但只是可能)。然后,对于每个预期范围,您创建相应的子实体类型,其父键(或只是一个参考,但父键更好地保持一致性 - 考虑跨实体组的事务)指向主实体。

    因此,范围中的每个实体都会收到与该范围相对应的类型的子实体。然后在与范围相对应的子实体类型上设置一个映射器,并检索其父实体以对其进行处理。

    在为 Relation Index Entity 模式填充我的数据时,我做了一些类似但方向相反的操作,并且针对单个子实体类型。因此,您的奖金问题的答案 - 继续使用 dao 或您的数据层包含的任何内容。

    虽然第一种方法更合理,但在您的范围不是非常动态和可管理的情况下,后者可能是可行的。鉴于数据存储的无模式特性,创建新实体类型既不昂贵也不是坏习惯。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-01-31
      • 2020-10-27
      • 1970-01-01
      • 1970-01-01
      • 2014-01-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多