2016-06-06 41 views
6

Ho una tabella Dynamodb con streaming abilitato. Inoltre ho creato un trigger per questa tabella che chiama una funzione AWS Lambda. All'interno di questa funzione lambda, sto provando a leggere la nuova immagine (elemento Dynamodb dopo la modifica) dal flusso Dynamodb e cercando di estrarre la pura stringa json. La mia domanda è come posso ottenere la pura stringa json dell'elemento DynamoDB che è stato inviato sullo stream? Sto usando lo snippet di codice indicato di seguito per ottenere la nuova immagine, ma non ho idea di come estrarre la stringa json. Apprezzo il tuo aiuto.Come ottenere la pura stringa Json da DynamoDB stream nuova immagine?

public class LambdaFunctionHandler implements RequestHandler<DynamodbEvent, Object> { 

@Override 
public Object handleRequest(DynamodbEvent input, Context context) { 
    context.getLogger().log("Input: " + input); 

    for (DynamodbStreamRecord record : input.getRecords()){ 

     context.getLogger().log(record.getEventID()); 
     context.getLogger().log(record.getEventName()); 
     context.getLogger().log(record.getDynamodb().toString()); 
     Map<String,AttributeValue> currentRecord = record.getDynamodb().getNewImage(); 

     //how to get the pure json string of the new image 
     //.............................................. 
    } 
    return "Successfully processed " + input.getRecords().size() + " records."; 
} 

}

+0

La mia vera intenzione era quella di inviare i dati da Dynamodb al server di ricerca elastico quando un elemento viene inserito/aggiornato/eliminato in Dynamodb. Sono riuscito a farlo utilizzando il modello di codice lambda python disponibile sulla console utente di AWS (creare una nuova sezione di funzione lambda). Quindi, senza alcuna preoccupazione sull'ottenere la pura stringa json dall'evento stream di Dynamodb, sono riuscito a inviare i dati direttamente da Dynamodb stream al servizio di ricerca Amazon Elastic utilizzando il modello di codice sopra menzionato. Spero che questo aiuti per qualcuno. –

risposta

0

Hai capire un modo per fare questo. Un modo semplice è quello di creare il tuo parser ma anche noi non vogliamo seguire questo approccio

+0

Ho paura, ho appena trovato un'alternativa che ho menzionato nel mio ultimo commento. –

0

Ho trovato un modo per farlo in modo pulito. Utilizzando InternalUtils da AWS-java-sdk-DynamoDB-1.11.15.jar

com.amazonaws.services.dynamodbv2.model.Record streamRecord = ((RecordAdapter) record).getInternalObject(); 
      // get order ready // 
      OrderFinal order = Utils.mapO2Object(
        InternalUtils.toSimpleMapValue(streamRecord.getDynamodb().getNewImage().get("document").getM()), 
        OrderFinal.class); 
+0

puoi fornire maggiori dettagli su questo? – Marckaraujo

+0

Non ho capito il commento. Quali dettagli vuoi? –

+0

Da dove proviene 'Utils.mapO2Object'? È la tua implementazione? – EagleBeak

-1

Questa libreria fa il lavoro: dynamoDb-marshaler

var unmarshalJson = require('dynamodb-marshaler').unmarshalJson; 

console.log('jsonItem Record: %j', unmarshalJson(record.dynamodb.NewImage)); 
4

Di seguito si riporta il codice completo per la conversione da Dynamo JSON a standard JSON :

import com.amazonaws.services.dynamodbv2.document.Item; 
import com.amazonaws.services.dynamodbv2.document.internal.InternalUtils; 
import com.amazonaws.services.dynamodbv2.model.AttributeValue; 
import com.amazonaws.services.lambda.runtime.Context; 
import com.amazonaws.services.lambda.runtime.RequestHandler; 
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent; 
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord; 
import com.google.gson.Gson; 

import java.util.ArrayList; 
import java.util.List; 
import java.util.Map; 

/** 
* Main Lambda class to receive event stream, parse it to Survey 
* and process them. 
*/ 
public class SurveyEventProcessor implements 
     RequestHandler<DynamodbEvent, String> { 

    private static final String INSERT = "INSERT"; 

    private static final String MODIFY = "MODIFY"; 

    public String handleRequest(DynamodbEvent ddbEvent, Context context) { 

     List<Item> listOfItem = new ArrayList<>(); 
     List<Map<String, AttributeValue>> listOfMaps = null; 
     for (DynamodbStreamRecord record : ddbEvent.getRecords()) { 

      if (INSERT.equals(record.getEventName()) || MODIFY.equals(record.getEventName())) { 
       listOfMaps = new ArrayList<Map<String, AttributeValue>>(); 
       listOfMaps.add(record.getDynamodb().getNewImage()); 
       listOfItem = InternalUtils.toItemList(listOfMaps); 
      } 

      System.out.println(listOfItem); 
      try { 
       // String json = new ObjectMapper().writeValueAsString(listOfItem.get(0)); 
       Gson gson = new Gson(); 
       Item item = listOfItem.get(0); 

       String json = gson.toJson(item.asMap()); 
       System.out.println("JSON is "); 
       System.out.println(json); 
      }catch (Exception e){ 
       e.printStackTrace(); 
      } 
     } 


     return "Successfully processed " + ddbEvent.getRecords().size() + " records."; 
    } 
} 
0

Basta che riassume la risposta di Himanshu Parmar:

Map<String, AttributeValue> newImage = record.getDynamodb().getNewImage(); 
List<Map<String, AttributeValue>> listOfMaps = new ArrayList<Map<String, AttributeValue>>(); 
listOfMaps.add(newImage); 
List<Item> itemList = InternalUtils.toItemList(listOfMaps); 
for (Item item : itemList) { 
    String json = item.toJSON(); 
}