2016-08-04 76 views
1

请记住,这是一个悬而未决的问题,我不是在寻找特定的答案,而只是我可以采取的方法和路线。填充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表?对于我的情况,最好的方法是什么?

因为我最初提出的问题,我做了更多的工作。

我做了什么至今

我有一个CSV文件坐在S3看起来像这样

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 

我能成功地把它捡起来作为s3object执行以下操作

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)等,但没有任何工作。我将不胜感激那种帮助

+0

你的链接是关于互补的东西,这两个似乎是你的问题需要。 没有更多的上下文,“最佳”方法很难说清楚。无论如何,我不明白为什么你不能以这两个片段作为出发点。 – MBW

+0

@MBW我可以肯定地从文件读取在这一点上,但我不能在表中插入任何东西。 – user1010101

+0

@MBW第二种方法的问题是使用本地文件,我有s3object,我想填充我的表。 – user1010101

回答

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

+0

这有点道理。是否有可能只是在相同的代码中显示如何使用该模式创建表或者是否可以手动创建表以允许此插入? – user1010101

+0

我也许是老派,但通常更喜欢从控制台创建架构,这里是[doc](http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIWorkingWithTables.html)从Java创建表代码,我没有尝试这样的代码,我会花一些时间来测试,但如果你有任何问题,请解决它应该工作好 –

+0

我为此道歉,但我想知道如果你能告诉我如何实现相同的事情给定的数据是csv格式而不是JSON。我很抱歉 – user1010101

相关问题