使用Java高级API从DynamoDB表中获取所有的表项

6
我使用dynamodbmapper在dynamodb表中实现了扫描操作,但是我没有得到所有的结果。每当我运行程序时,扫描返回不同数量的项。
代码片段:
DyanmoDBScanExpression scanExpression = new DynamoDBScanExpression();
List<Books> scanResult = mapper.scan(Books.class, scanExpression);

我进行了调查,发现了扫描返回的项目数量限制。但是我无法找到使用mapper获取表中所有项的方法!是否有一种方式可以遍历表格中的所有项。我已经在JVM中设置了足够的堆内存,因此不会出现内存问题。

6个回答

8

在Java中使用DynamoDBScanExpression无需任何过滤器。

// Change to your Table_Name (you can load dynamically from lambda env as well)
DynamoDBMapperConfig mapperConfig = new DynamoDBMapperConfig.Builder().withTableNameOverride(DynamoDBMapperConfig.TableNameOverride.withTableNameReplacement("Table_Name")).build();

DynamoDBMapper mapper = new DynamoDBMapper(client, mapperConfig);

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();

// Change to your model class   
List < ParticipantReport > scanResult = mapper.scan(ParticipantReport.class, scanExpression);



// Check the count and iterate the list and perform as desired.
scanResult.size();

我刚刚尝试了这段代码,但它没有起作用。 - Arefe
请提供堆栈跟踪或错误详细信息。 - Jacob Joy
小修正,它返回的是PaginatedScanList而不是List。 - Saurabh Dhage
这将仅返回 DynamoDB 限制的项目,即1MB,您需要实现分页以检索所有项目。请参阅https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Scan.html。 - Devansh Sharma

4

你能编程地告诉我如何实现它或提供参考文档吗?谢谢。 - dushyantashu
更新的答案。这并不神奇。您只需像处理任何列表一样迭代列表即可。 - Mircea
这也是我之前所做的。但我没有得到所有的项目。每次运行时,我得到不同数量的项目。 - dushyantashu
数字有何不同?它在增加吗?有很大的变化吗?在迭代列表时,您是否看到了对Dynamo的额外调用? - Mircea
它们并不总是递增的,它们只是每次都不同。我该如何检查对dynamodb的额外调用?我对dynamodb没有太多经验,我刚开始实现它。 - dushyantashu
表格是否在变化?我会使用tcpdump查看网络流量,以查看是否有其他调用。 - Mircea

3

0

DynamoDBScanExpression scanExpression = new DynamoDBScanExpression();
List<Books> scanResult = new ArrayList<Books>(mapper.scan(Books.class, scanExpression));

这将会正常运作,它将遍历所有的项目并返回一个列表。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心找到有关如何编写良好答案的更多信息。 - Community

0

有点晚了,但是

import java.util.HashMap;
import java.util.Map;
import java.util.List;

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBMapper;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBQueryExpression;
import com.amazonaws.services.dynamodbv2.AmazonDynamoDBClient;
import com.amazonaws.services.dynamodbv2.model.AttributeValue;

public final class LogFetcher {

    static AmazonDynamoDBClient client = new AmazonDynamoDBClient();
    static String tableName = "SystemLog";

    public static List<SystemLog> findLogsForDeviceWithMacID(String macID) {

        client.setRegion(Region.getRegion(Regions.EU_WEST_1));

        DynamoDBMapper mapper = new DynamoDBMapper(client);
        Map<String, AttributeValue> eav = new HashMap<String, AttributeValue>();
        eav.put(":val1", new AttributeValue().withS(macID));

        DynamoDBQueryExpression<SystemLog> queryExpression = new DynamoDBQueryExpression<SystemLog>()
                .withKeyConditionExpression("parentKey = :val1")
                .withExpressionAttributeValues(eav);

         List<SystemLog> requestedLogs = mapper.query(SystemLog.class, queryExpression);

        return requestedLogs;
    }
}

和示例类

import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBAttribute;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBHashKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBRangeKey;
import com.amazonaws.services.dynamodbv2.datamodeling.DynamoDBTable;

@DynamoDBTable(tableName="SystemLog")
public final class SystemLog {
    public Integer pidValue;
    public String uniqueId;
    public String parentKey;

    //DynamoDB

    //Partition (hash) key
    @DynamoDBHashKey(attributeName="parentKey")
    public String getParentKey() { return parentKey; }
    public void setParentKey(String parentKey) { this.parentKey = parentKey; }

    //Range key
    @DynamoDBRangeKey(attributeName="uniqueId")
    public String getUniqueId() { return uniqueId; }
    public void setUniqueId(String uniqueId) { this.uniqueId = uniqueId;} 

    @DynamoDBAttribute(attributeName="pidValue")
    public Integer getPidValue() { return pidValue; }    
    public void setPidValue(Integer pidValue) { this.pidValue = pidValue; }
}

这是一个查询表达式,不同于扫描。 - Shubham Chopra

0
默认情况下,DynamoDBMapper#scan方法返回一个"懒加载"集合。它最初仅返回一页结果,然后在需要时调用服务以获取下一页。要获取所有匹配的项,请迭代分页结果集。
然而,PaginatedScanList带有开箱即用的PaginatedScanList#loadAllResults方法,可帮助急切地加载此列表的所有结果。
注意:loadAllResults方法不支持ITERATION_ONLY模式。
List<Books> scanResult = mapper.scan(Books.class, new DynamoDBScanExpression());
scanResult.loadAllResults();//Eagerly loads all results for this list.
//Total results loaded into the list
System.out.println(scanResult.size());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接