Amazon dynamodb 如何使用gte比较运算符查询dynamodb表

Amazon dynamodb 如何使用gte比较运算符查询dynamodb表,amazon-dynamodb,boto,Amazon Dynamodb,Boto,我有一个简单的dynamodb2表,其中包含任务名称(字符串)及其开始时间(数字/浮点)。如何获取开始时间大于给定数字X的所有记录? 目前,我尝试将开始时间作为全局二级索引,并使用了以下内容: 表hashkey是任务名称,range key是开始时间。 我在start_时间上创建了一个二级全局索引(start_时间索引),并使用它来查询下面的内容 recs =tab.query(start_time__gte=1, index='start_time-index') 然而,它说: Traceb

我有一个简单的dynamodb2表,其中包含任务名称(字符串)及其开始时间(数字/浮点)。如何获取开始时间大于给定数字X的所有记录? 目前,我尝试将开始时间作为全局二级索引,并使用了以下内容:

表hashkey是任务名称,range key是开始时间。 我在start_时间上创建了一个二级全局索引(start_时间索引),并使用它来查询下面的内容

recs =tab.query(start_time__gte=1, index='start_time-index')
然而,它说:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/results.py", line 62, in __next__
    self.fetch_more()
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/results.py", line 146, in fetch_more
    results = self.the_callable(*args, **kwargs)
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/table.py", line 1132, in _query
    **kwargs
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 1522, in query
    body=json.dumps(params))
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 2100, in make_request
    retry_handler=self._retry_handler)
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/connection.py", line 937, in _mexe
    status = retry_handler(response, i, next_sleep)
  File "/nail/home/osarood/work/.venv/local/lib/python2.7/site-packages/boto/dynamodb2/layer1.py", line 2140, in _retry_handler
    response.status, response.reason, data)
boto.dynamodb2.exceptions.ValidationException: ValidationException: 400 Bad Request
{u'message': u'Query key condition not supported', u'__type': u'com.amazon.coral.validate#ValidationException'}
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/results.py”,第62行,下一页__
self.fetch_more()
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/results.py”,第146行,在fetch_more中
结果=自身。可调用的参数(*args,**kwargs)
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/table.py”,第1132行,在查询中
**夸尔斯
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/layer1.py”,第1522行,在查询中
body=json.dumps(参数))
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/layer1.py”,第2100行,在make_请求中
retry\u handler=self.\u retry\u handler)
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/connection.py”,第937行,in_-mexe
状态=重试\u处理程序(响应、i、下一个\u睡眠)
文件“/nail/home/osarood/work/.venv/local/lib/python2.7/site packages/boto/dynamodb2/layer1.py”,第2140行,在处理程序中
响应。状态、响应。原因、数据)
boto.dynamodb2.exceptions.ValidationException:ValidationException:400错误请求
{u'message':u'Query key condition not supported',u''uu'type':u'com.amazon.coral.validate#ValidationException'}
(已编辑-查看修订历史以了解原始错误答案)

出现错误的原因是您没有为查询指定哈希键-

为了解决这个问题,有两个备选方案:

如果执行范围查询时知道任务名称,则不需要GSI;只需在带有EQ条件的查询中包含taskName

如果您不知道任务名称,那么GSI可以解决这个问题,这是正确的,但是它的工作方式有一些限制。GSI需要记住的是,它们基本上也只是桌子,但它们是由迪纳摩公司在引擎盖下维护的。因此,它们还需要hashkey和rangekey来指定唯一性

  • 为了在不使用任务名称的情况下进行查询,您将需要一个替代的hashkey-为了保持简单,我建议使用类似以下方法:
    • 创建一个GSI,哈希键为
      YearMonth
      (例如,201508)和范围键
      timestamp+taskName
      (将taskName附加到GSI范围键的原因是为了确保GSI中hashkey/rangekey组合的正确唯一性)
    • 多次查询GSI,每个月查询一次。查询还通过范围键
      时间戳>[给定时间戳]
      进行过滤
    • 这种方法的一个缺点是,如果您快速创建大量任务,您很可能在YearMonth上有一个热哈希键,这将影响您的表吞吐量-有关于处理时间序列数据的更多提示:
    • 使GSI哈希键更细粒度
    • 使用可能具有不同哈希键粒度的不同表(基于日期范围生成的表名)来管理热/冷数据

作为最后的手段,考虑使用一个完整的表扫描(这是一个最后的手段,因为它真的会影响你的吞吐能力)

你的代码是什么类型?StaskStimeTime//Cuth>属性?它是一个数字。基本上现在是大纪元时间。添加范围键(可能)在这里没有帮助。正如您在回答中所指出的,范围键仅在使用已知散列键查询条目时才有用。因此,除非事先知道所有的散列键(在本例中为任务名称),否则不能仅在开始时间查询。@jonson-完全正确。我不知道我写这篇文章的时候在想什么。有趣的是OP接受了它,这阻止了我删除它。请随意修改以使其有用。@jonson-我已对答案进行了实质性更新。我愿意进一步编辑建议,如果你有他们。