填充DynamoDb表的最佳方法

时间:2016-08-04 18:22:12

标签: json csv amazon-web-services amazon-s3 amazon-dynamodb

请记住,这是一个悬而未决的问题,我不是在寻找具体的答案,而是我可以采取的方法和路线。

基本上我从我的aws s3存储桶中获取了一个csv文件。我能够成功使用

AmazonS3 s3Client = new AmazonS3Client(new ProfileCredentialsProvider());        
S3Object object = s3Client.getObject(
                  new GetObjectRequest(bucketName, key));

现在我想使用此JSON文件填充dynamodb表。

我很困惑,因为我在网上发现了各种各样的东西。

这是一个suggestion - 但这种方法只是读取未向dynamodb表插入任何内容的文件。

这是另一个suggestion - 这种方法与我正在寻找的方法非常接近,它是从JSON文件中填充表格。

但是我想知道是否有一种通用的方法来准备任何json文件并根据它填充一个dynamodb表?另外对于我的情况,哪种方法最好?

由于我最初问过这个问题,我做了更多工作。

到目前为止我做了什么

我在s3中有一个csv文件,看起来像这样

name,position,points,assists,rebounds
Lebron James,SF,41,12,11
Kyrie Irving,PG,41,7,5
Stephen Curry,PG,29,8,4
Klay Thompson,SG,31,5,5

我能够成功地将其作为s3对象进行以下操作

AmazonS3 s3client = new AmazonS3Client(/**new ProfileCredentialsProvider()*/); 
    S3Object object = s3client.getObject(
            new GetObjectRequest("lambda-function-bucket-blah-blah", "nba.json"));
            InputStream objectData = object.getObjectContent();

现在我想将其插入到我的dynamodb表中,以便我尝试以下操作。

AmazonDynamoDBClient dbClient = new AmazonDynamoDBClient();
dbClient.setRegion(Region.getRegion(Regions.US_BLAH_1));

DynamoDB dynamoDB = new DynamoDB(dbClient); 
//DynamoDB dynamoDB = new DynamoDB(client); 
Table table = dynamoDB.getTable("MyTable"); 

//在这一点之后我尝试了很多json解析器等并且做了table.put(item)等但没有任何工作。我很感激亲切的帮助

1 个答案:

答案 0 :(得分:1)

对于CSV解析,您可以使用普通阅读器,因为您的文件看起来非常简单

    AmazonS3 s3client = new AmazonS3Client(/**new ProfileCredentialsProvider()*/); 
    S3Object object = s3client.getObject(
                new GetObjectRequest("lambda-function-bucket-blah-blah", "nba.json"));
    InputStream objectData = object.getObjectContent();

    AmazonDynamoDBClient dbClient = new AmazonDynamoDBClient();
    dbClient.setRegion(Region.getRegion(Regions.US_BLAH_1));

    DynamoDB dynamoDB = new DynamoDB(dbClient); 
    //DynamoDB dynamoDB = new DynamoDB(client); 
    Table table = dynamoDB.getTable("MyTable"); 

    String line = "";
    String cvsSplitBy = ",";

    try (BufferedReader br = new BufferedReader(
                                new InputStreamReader(objectData, "UTF-8"));

        while ((line = br.readLine()) != null) {

            // use comma as separator
            String[] elements = line.split(cvsSplitBy);

            try {
                table.putItem(new Item()
                    .withPrimaryKey("name", elements[0])
                    .withString("position", elements[1])
                    .withInt("points", elements[2])
                    .....);

                System.out.println("PutItem succeeded: " + elements[0]);

            } catch (Exception e) {
                System.err.println("Unable to add user: " + elements);
                System.err.println(e.getMessage());
                break;
            }

        }

    } catch (IOException e) {
        e.printStackTrace();
    }

根据CSV的复杂程度,您可以使用第三方库,例如Apache CSV Parseropen CSV

我留下原始答案来解析JSon

我会使用Jackson库并按照您的代码执行以下操作

    AmazonS3 s3client = new AmazonS3Client(/**new ProfileCredentialsProvider()*/); 
    S3Object object = s3client.getObject(
                new GetObjectRequest("lambda-function-bucket-blah-blah", "nba.json"));
    InputStream objectData = object.getObjectContent();

    AmazonDynamoDBClient dbClient = new AmazonDynamoDBClient();
    dbClient.setRegion(Region.getRegion(Regions.US_BLAH_1));

    DynamoDB dynamoDB = new DynamoDB(dbClient); 
    //DynamoDB dynamoDB = new DynamoDB(client); 
    Table table = dynamoDB.getTable("MyTable"); 

    JsonParser parser = new JsonFactory()
        .createParser(objectData);

    JsonNode rootNode = new ObjectMapper().readTree(parser);
    Iterator<JsonNode> iter = rootNode.iterator();

    ObjectNode currentNode;

    while (iter.hasNext()) {
        currentNode = (ObjectNode) iter.next();

        String lastName  = currentNode.path("lastName").asText();
        String firstName = currentNode.path("firstName").asText();
        int minutes      = currentNode.path("minutes").asInt();
        // read all attributes from your JSon file

        try {
            table.putItem(new Item()
                .withPrimaryKey("lastName", lastName, "firstName", firstName)
                .withInt("minutes", minutes));

            System.out.println("PutItem succeeded: " + lastName + " " + firstName);

        } catch (Exception e) {
            System.err.println("Unable to add user: " + lastName + " " + firstName);
            System.err.println(e.getMessage());
            break;
        }
    }
    parser.close();

在表中插入记录将取决于您的模式,我只是放了一个任意的例子,但无论如何这将使您获得文件的读取以及插入dynamoDB表的方式

当您谈到不同的方法时,另一种可能性是设置AWS Pipeline