2016-08-04 19 views
1

Bitte beachten Sie, dies ist eine offene Frage, und ich bin nicht auf der Suche nach einer bestimmten Antwort, sondern nur Annäherungen und Routen, die ich nehmen kann.Beste Lösung, um DynamoDb Tabelle zu füllen

Im Wesentlichen bekomme ich eine CSV-Datei von meinem aws s3 Eimer. Ich bin in der Lage, es erfolgreich zu bekommen

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

Jetzt möchte ich eine Dynamob Tabelle mit dieser JSON-Datei zu füllen.

Ich war verwirrt, als ich alle möglichen Sachen online fand.

Hier ist eine suggestion - Dieser Ansatz liest jedoch nur die Datei, die nichts in die dynamodb-Tabelle einfügt.

Hier ist eine weitere suggestion - Dieser Ansatz ist viel näher an dem, was ich suche, es füllt eine Tabelle aus einer JSON-Datei.

Wie auch immer, ich frage mich, gibt es eine generische Möglichkeit, eine JSON-Datei vorzubereiten und eine Dynamodb-Tabelle basierend darauf zu bevölkern? Auch für meinen Fall, welcher Ansatz ist der beste?

Da ich ursprünglich die Frage stellte, habe ich mehr Arbeit geleistet.

Was ich bisher getan haben

Ich habe eine CSV-Datei in s3 Sitzung, die wie diese erfolgreich es ich bin in der Lage

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 

schaut zu holen als s3object folgendes tun

Jetzt möchte ich dies in meine Dynamodb-Tabelle einfügen, also versuche ich Folgendes.

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"); 

// nach diesem Punkt habe ich viele json Parser usw. ausprobiert und tat table.put (Artikel) usw., aber nichts hat funktioniert.Ich würde Art schätzen helfen

+0

Ihre Links sind über ergänzende Dinge, die beide für Ihr Problem benötigt werden. Ein "bester" Ansatz ist ohne viel mehr Kontext schwer zu sagen. Auf jeden Fall sehe ich nicht, warum man nicht anfangen konnte, diese zwei Schnipsel als Ausgangspunkt zu verwenden. – MBW

+0

@MBW Ich kann definitiv an dieser Stelle aus der Datei lesen, aber ich kann nichts in die Tabelle einfügen. – user1010101

+0

@MBW auch das Problem mit dem zweiten Ansatz ist, dass eine lokale Datei verwendet, habe ich s3object, die ich meine Tabelle aus füllen möchte. – user1010101

Antwort

1

Für CSV-Analyse können Sie Klar Leser verwenden als Datei

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

Abhängig von der Komplexität Ihrer CSV ganz einfach aussieht, können Sie 3rd-Party-Bibliotheken wie Apache CSV Parser oder open CSV

verwenden können

ich lasse die ursprüngliche Antwort für JSon Parsen

ich die Jackson Bibliothek verwenden würde und folgenden Code Sie wie folgt vor

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

die Datensätze in der Tabelle einfügen wird von Ihrem Schema ab, ich habe nur ein beliebiges Beispiel, aber trotzdem wird diese Sie das Lesen von Dateien erhalten und den Weg in die DynamoDB Tabelle

Wie einfügen Sie sprachen über die verschiedenen Ansätze, eine andere Möglichkeit ist, eine AWS Pipeline

+0

Das macht ein wenig Sinn. ist es möglich, vielleicht nur im selben Code zu zeigen, wie ich eine Tabelle mit diesem Schema erstellen kann oder kann ich eine Tabelle manuell erstellen, um diese Einfügung zu erlauben? – user1010101

+0

Ich bin vielleicht alte Schule, aber in der Regel lieber Schema von der Konsole zu erstellen, hier ist die [doc] (http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/JavaDocumentAPIWorkingWithTables.html), um Tabellen aus Java zu erstellen Code, ich habe nicht versucht, einen solchen Code, werde mich etwas Zeit zu testen, aber Sie, wenn Sie ein Problem haben, bitte Adresse sollte funktionieren ok –

+0

ich entschuldige mich dafür, aber ich fragte mich, ob Sie mir zeigen können, wie man das gleiche erreichen angegebene Daten sind im CSV-Format und nicht JSON. ich entschuldige mich – user1010101