gpt4 book ai didi

java - 仅使用辅助全局索引查询 Dynamodb 表

转载 作者:搜寻专家 更新时间:2023-10-31 19:38:42 24 4
gpt4 key购买 nike

我正在尝试使用辅助全局索引查询 Dynamodb 表,但出现 java.lang.IllegalArgumentException:非法查询表达式:查询中未找到散列键条件。我想要做的就是在不考虑 key 的情况下获取所有时间戳大于值的项目。时间戳不是键或范围键的一部分,所以我为它创建了一个全局索引。

有人知道我可能遗漏了什么吗?

表定义:

{
AttributeDefinitions:[
{
AttributeName:timestamp,
AttributeType:N
},
{
AttributeName:url,
AttributeType:S
}
],
TableName:SitePageIndexed,
KeySchema:[
{
AttributeName:url,
KeyType:HASH
}
],
TableStatus:ACTIVE,
CreationDateTime: Mon May 12 18:45:57 EDT 2014,
ProvisionedThroughput:{
NumberOfDecreasesToday:0,
ReadCapacityUnits:8,
WriteCapacityUnits:4
},
TableSizeBytes:0,
ItemCount:0,
GlobalSecondaryIndexes:[
{
IndexName:TimestampIndex,
KeySchema:[
{
AttributeName:timestamp,
KeyType:HASH
}
],
Projection:{
ProjectionType:ALL,

},
IndexStatus:ACTIVE,
ProvisionedThroughput:{
NumberOfDecreasesToday:0,
ReadCapacityUnits:8,
WriteCapacityUnits:4
},
IndexSizeBytes:0,
ItemCount:0
}
]
}

代码

Condition condition1 = new Condition().withComparisonOperator(ComparisonOperator.GE).withAttributeValueList(new AttributeValue().withN(Long.toString(start)));      
DynamoDBQueryExpression<SitePageIndexed> exp = new DynamoDBQueryExpression<SitePageIndexed>().withRangeKeyCondition("timestamp", condition1);
exp.setScanIndexForward(true);
exp.setLimit(100);
exp.setIndexName("TimestampIndex");

PaginatedQueryList<SitePageIndexed> queryList = client.query(SitePageIndexed.class,exp);

最佳答案

All I'm trying to do is to get all items that have a timestamp greater than a value without considering the key.

这不是 Amazon DynamoDB 上的全局二级索引 (GSI) 的工作方式。要查询 GSI,您必须为其哈希键指定一个值,然后您可以按范围键过滤/排序——就像您对主键所做的那样。这正是异常试图告诉您的内容,也是您将在 documentation page for the Query API 上找到的内容。 :

A Query operation directly accesses items from a table using the table primary key, or from an index using the index key. You must provide a specific hash key value.

将 GSI 视为只是另一个键,其行为几乎与主键完全相同(主要区别在于它是异步更新的,并且您只能对 GSI 执行最终一致性读取)。

有关创建 GSI 的指南和最佳实践,请参阅 Amazon DynamoDB 全局二级索引文档页面:http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html

实现您想要的目标的一种可能方法是将 dummy 属性限制为有限的、一小组可能的值,创建一个 GSI,在该虚拟属性上使用散列键,在该虚拟属性上使用范围键你的时间戳。查询时,您需要为虚拟散列键属性上的每个可能值发出一个查询 API 调用,然后将结果合并到您的应用程序中。通过将虚拟属性限制为单例(即具有单个元素的集合,即常量值),您可以仅发送一个查询 API 调用并直接获得结果数据集——但请记住,这将导致你的问题与热分区有关,你可能有性能问题!同样,请参阅上面链接的文档以了解最佳实践和一些模式。

关于java - 仅使用辅助全局索引查询 Dynamodb 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23621104/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com