2016-06-06 10 views
6

Mam tabelę Dynamodb z włączoną transmisją strumieniową. Również stworzyłem wyzwalacz dla tej tabeli, która wywołuje funkcję AWS Lambda. W ramach tej funkcji lambda próbuję odczytać nowy obraz (pozycja Dynamodb po modyfikacji) ze strumienia Dynamodb i próbuję uzyskać z niego czysty ciąg jsonów. Moje pytanie brzmi: jak mogę uzyskać czysty łańcuch json elementu DynamoDB, który został wysłany przez strumień? Używam fragmentu kodu podanego poniżej, aby uzyskać nowy obraz, ale nie mam pojęcia, jak usunąć z niego ciąg jsonów. Doceniam Twoją pomoc.Jak uzyskać ciąg czysty Json z nowego strumienia DynamoDB?

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

Moją prawdziwą intencją było wysłanie danych z Dynamodb do elastycznego serwera wyszukiwania, gdy element został wstawiony/zaktualizowany/usunięty w Dynamodb. Udało mi się to osiągnąć za pomocą szablonu kodu lambda Pythona, który jest dostępny na konsoli użytkownika AWS (utwórz nową sekcję funkcji lambda). Tak więc bez obaw o uzyskanie czystego łańcucha json z zdarzenia strumienia Dynamodb, udało mi się przesłać dane bezpośrednio ze strumienia Dynamodb do usługi wyszukiwania Amazon Elastic przy użyciu wspomnianego powyżej szablonu kodu. Mam nadzieję, że to pomaga komuś. –

Odpowiedz

0

Czy wymyślić sposób, aby to zrobić. Jednym z niedokończonych sposobów jest stworzenie własnego parsera, ale nawet nie chcemy tego robić.

+0

Obawiam się, po prostu wymyśliłem alternatywę, o której wspomniałem w swoim ostatnim komentarzu. –

0

Znaleźliśmy sposób na robienie tego w czysty sposób. Korzystanie InternalUtils z 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

możesz przynieść więcej szczegółów na ten temat? – Marckaraujo

+0

Nie rozumiem komentarza. Jakie dane chcesz? –

+0

Skąd pochodzi 'Utils.mapO2Object'? Czy to twoja własna realizacja? – EagleBeak

-1

Ta biblioteka wykonać zadanie: dynamoDb-marshaler

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

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

Poniżej znajduje się pełny kod do konwersji z Dynamem JSON do standardowego 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

Wystarczy podsumowująca odpowiedź 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(); 
}