【问题标题】:How to query DynamoDB using ONLY Partition Key [Java]?如何仅使用分区键 [Java] 查询 DynamoDB?
【发布时间】:2021-07-25 23:41:07
【问题描述】:

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

我有一个名为“ervive-pdi-data-invalid-qa”的表,它的架构是:

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

表格如下所示: Table

我想通过使用 (software.amazon.awssdk) 新版本的 AWS 开发工具包 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:PE1MKPMQ9MLT51OLJQVDCURQGBVV4KQNSO5AEMVJF66Q9ASUAAJG,扩展请求 ID:null)

【问题讨论】:

  • 可以,只要尝试创建一个同时包含Partition key和Range key的查询,然后去掉Range key condition部分。

标签: amazon-dynamodb


【解决方案1】:

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

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());
}

单个Query操作最多可以检索1 MB的数据,see documentation

【讨论】:

  • 当您知道您为分区键提供的值将仅返回一个项目时,是否可以查询表并返回单个项目而不是项目集合?
  • 是的,如果 Query API 只找到单个项目,那么它仍然会以数组 Items: [{..}] 的形式返回,而不是您在 GetItem API 响应中获得的单个对象。
【解决方案2】:

我一直在与 Padma 合作解决这个问题。我们首先尝试了 A. Khan 的代码,但无法通过 v1 的身份验证。相反,我们得到 "警告:您的配置文件名称包含一个“配置文件”前缀。这被认为是 Java SDK 中配置文件名称的一部分,因此当您从以下位置引用此配置文件时,您需要在配置文件名称中包含此前缀你的 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());
        }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-30
    • 1970-01-01
    • 2019-05-19
    • 2019-11-26
    • 2017-07-18
    • 1970-01-01
    • 2018-05-04
    相关资源
    最近更新 更多