当前位置: 首页 > 知识库问答 >
问题:

如何仅使用分区键[Java]查询DynamoDB?

夏宏旷
2023-03-14

我是DynamoDB的新手,想知道我们如何通过在JAVA中使用ONLY分区键来查询DynamoDB中的表

我有一个名为“ervive pdi data invalid qa”的表,其模式是:

  1. 分区键为SubmissionId
  2. 排序键是id。
  3. 城市(属性)
  4. 错误(属性)

这张桌子看起来像这样:桌子

我想通过使用(software.amazon.awssdk)新版本的AWS SDK DynamoDB类使用分区键来检索排序键值和剩余属性数据。

有可能得到它吗?如果有,任何人都可以张贴答案吗?

我试过这个:

       DynamoDbClient ddb = 
           DynamoDbClient.builder().region(Region.US_EAST_1).build();
             DynamoDbEnhancedClient enhancedClient = 
                DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();

        //Define table
        DynamoDbTable<ErvivePdiDataInvalidQa> table = 
           enhancedClient.table("ervive-pdi-data-invalid-qa",
                  TableSchema.fromBean(ErvivePdiDataInvalidQa.class));

        Key key = Key.builder().partitionValue(2023).build();
        ErvivePdiDataInvalidQa result = table.getItem(r->r.key(key));
        System.out.println("The record id is "+result.getId());

ErvivePdiDataInvalidQa表类在下面评论*

它返回“提供的键元素与模式不匹配(服务:DynamoDb,状态代码:400,请求ID:PE1MKPMQ9MLT51OLJQVDCURQGBVVV4KQNSO5AEMVJF66Q9ASUAJG,扩展请求ID:null)”

共有2个答案

卢阳成
2023-03-14

我一直在与Padma合作解决这个问题。我们首先尝试了可汗的代码,但无法通过v1的身份验证。相反,我们得到了“警告:您的个人资料名称包含一个“个人资料”前缀。这被认为是JavaSDK中配置文件名称的一部分,因此当您从Java代码中引用此配置文件时,您需要在配置文件名称中包含此前缀。"最终它无法获得凭据。我们的凭据在. aws/config-i2文件中扮演IAM角色。它在v2中工作正常,但在v1中不行。

然后我们尝试了SDK的v2,连接没有问题,但是当我们试图从表中获取所有记录时,会返回NULL。

在下面所有使用SDK v2的尝试中,表数据返回NULL

我们创建了这个表类

package data;

import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbBean;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbPartitionKey;
import software.amazon.awssdk.enhanced.dynamodb.mapper.annotations.DynamoDbSortKey;

@DynamoDbBean
public class ErvivePdiDataInvalidQa {
    private int submissionId;
    private String id;
    private String address1;
    private String city;
    private String dateOfBirth;
    private String errors;
    private String firstName;
    private String firstNameNormalized;
    private String gender;
    private String lastName;
    private String lastNameNormalized;
    private String middleNameInitial;
    private String postalCode;
    private String rowNumber;
    private String state;
    private String submissionType;

    @DynamoDbPartitionKey
    public int getSubmissionId() {
        return submissionId;
    }

    public void setSubmissionId(int submissionId) {
        this.submissionId = submissionId;
    }

    @DynamoDbSortKey
    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getAddress1() {
        return address1;
    }

    public void setAddress1(String Address1) {
        this.address1 = Address1;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(String dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public String getErrors() {
        return errors;
    }

    public void setErrors(String errors) {
        this.errors = errors;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getFirstNameNormalized() {
        return firstNameNormalized;
    }

    public void setFirstNameNormalized(String firstNameNormalized) {
        this.firstNameNormalized = firstNameNormalized;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLastNameNormalized() {
        return lastNameNormalized;
    }

    public void setLastNameNormalized(String lastNameNormalized) {
        this.lastNameNormalized = lastNameNormalized;
    }

    public String getMiddleNameInitial() {
        return middleNameInitial;
    }

    public void setMiddleNameInitial(String middleNameInitial) {
        this.middleNameInitial = middleNameInitial;
    }

    public String getPostalCode() {
        return postalCode;
    }

    public void setPostalCode(String postalCode) {
        this.postalCode = postalCode;
    }

    public String getRowNumber() {
        return rowNumber;
    }

    public void setRowNumber(String rowNumber) {
        this.rowNumber = rowNumber;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getSubmissionType() {
        return submissionType;
    }

    public void setSubmissionType(String submissionType) {
        this.submissionType = submissionType;
    }
}

DynamoDB代码获取所有记录

//Connection
        DynamoDbClient ddb = DynamoDbClient.builder().build();
        DynamoDbEnhancedClient enhancedClient = DynamoDbEnhancedClient.builder()
                .dynamoDbClient(ddb)
                .build();

        //Define table
        DynamoDbTable<ErvivePdiDataInvalidQa> table = enhancedClient.table("ervive-pdi-data-invalid-qa", TableSchema.fromBean(ErvivePdiDataInvalidQa.class));

        //Get All Items from table - RETURNING NULL
        Iterator<ErvivePdiDataInvalidQa> results = table.scan().items().iterator();
        while (results.hasNext()) {

            ErvivePdiDataInvalidQa rec = results.next();
            System.out.println("The record id is "+rec.getId());
        }

还尝试了:

要按SubmissionID筛选的DynamoDB代码

AttributeValue attr = AttributeValue.builder()
                .n("1175")
                .build();

        // Get only Open items in the Work table
        Map<String, AttributeValue> myMap = new HashMap<>();
        myMap.put(":val1", attr);

        Map<String, String> myExMap = new HashMap<>();
        myExMap.put("#sid", "SubmissionId");

        // Set the Expression so only Closed items are queried from the Work table
        Expression expression = Expression.builder()
                .expressionValues(myMap)
                .expressionNames(myExMap)
                .expression("#sid = :val1")
                .build();

        ScanEnhancedRequest enhancedRequest = ScanEnhancedRequest.builder()
                .filterExpression(expression)
                .limit(15)
                .build();

        // Get items in the Record table and write out the ID value
        Iterator<ErvivePdiDataInvalidQa> results = table.scan(enhancedRequest).items().iterator();

        while (results.hasNext()) {

            ErvivePdiDataInvalidQa record = results.next();
            System.out.println("The record id is " + record.getId());
        }
弓胜泫
2023-03-14

您需要的查询记录在AWS Dynamodb Java查询API的一个示例中。

AmazonDynamoDB client = AmazonDynamoDBClientBuilder.standard()
.withRegion(Regions.US_WEST_2).build();
DynamoDB dynamoDB = new DynamoDB(client);

Table table = dynamoDB.getTable("ervive-pdi-data-invalid-qa");

QuerySpec spec = new QuerySpec()
    .withKeyConditionExpression("SubmissionId = :v_id")
    .withValueMap(new ValueMap()
        .withInt(":v_id", 2146));

ItemCollection<QueryOutcome> items = table.query(spec);

Iterator<Item> iterator = items.iterator();
Item item = null;
while (iterator.hasNext()) {
    item = iterator.next();
    System.out.println(item.toJSONPretty());
}

单个查询操作最多可以检索1MB的数据,请参阅文档

 类似资料:
  • 我试图查询具有分区键和排序键的表(但是分区键和排序键是1:1,我只想使用分区键[仅返回一项]进行查询)。 这是我尝试过的代码,但没有成功(testId是分区键名,1234567890是字符串形式的分区键值);你们都知道我可以只使用分区键进行查询的方法吗?记住,由于分区键和排序键是1:1,所以只会返回一个项?提前非常感谢您。[这是我的第一篇堆栈溢出帖子-很抱歉,如果我用词不当,我很乐意回答关于我的措

  • 也许不拆分文档是解决问题的办法,但是不同的文档有不同的TTL,这就会产生问题,是不是( CustomerId是分区密钥。 ms的医生说这是可能的(引用了一个城市=西雅图)例子。他们的分区是城市....

  • 类似Bigtable的数据库存储按其键排序的行。 Cassandra使用分区和聚类键的结合来保持数据的分布和排序;但是,您只能通过使用分区键来选择行! 用于上述查询的Cassandra存储层的可视化。

  • 我正在DynamoDB中设计一个表,它将包含大量记录,每个记录都有一个唯一的ID和一个时间戳。我需要检索一组位于两个日期之间的记录,而不管所有其他属性值如何。 为时间戳字段添加全局辅助索引似乎是一个合乎逻辑的解决方案,但这并不简单。 DynamoDB中的Query命令需要一个KeyConditionExpression参数,该参数确定查询返回的结果。从DynamoDB开发人员指南: 要指定搜索条件

  • 问题内容: 我在Golang中使用aws-sdk-go库进行DynamoDb连接。 我的DynamoDb表具有分区键DeviceId(字符串)和排序键时间(数字)。如何编写GetItemInput以获取具有特定DeviceId的所有数据? 问题答案: 您必须使用查询或扫描操作,这是一个简单的示例,但是您可以在此处阅读有关Amazon文档的更多信息。 特别是查询操作 查询操作仅使用主键属性值在表或辅

  • 我有一个用JPA和Spring Data DynamoDB建立的Spring项目。它工作正常。我可以通过分区键和排序键(称为DynamoDBHashKey和DynamoDBRangeKey)读取DynamoDB表中的项。 我的问题是,我的存储库的设置方式是使用查询和扫描操作来读取表,而不是使用获取项目操作,这应该会更高效。 这是我的实体: 这是我的存储库: 当我的表同时具有分区键和排序键时,如何配