Непонятная ошибка даты при вставке в DynamodB? - PullRequest
0 голосов
/ 02 мая 2018

Я делаю небольшой POC в AWS. Я пытаюсь прочитать CSV-файл из корзины S3 и нужно вставить эти данные CSV-файла в DynamodB. Все идет хорошо, но, перебирая данные файла CSV в первой строке, он завершается.

Я создал одну таблицу, т. Е. Данные транспортных средств внутри динамодаба, с одним первичным ключом, т.е. veh_price_id.

Все идет хорошо до тех пор, пока "я не нахожусь внутри цикла" после того, как эта проблема возникнет.

Кодирование

public class LambdaFunctionHandler implements RequestHandler<S3Event, Report> {

Region AWS_REGION = Region.getRegion(Regions.US_EAST_1);
String DYNAMO_TABLE_NAME = "vehicledata";

public Report handleRequest(S3Event s3event, Context context) {
long startTime = System.currentTimeMillis();
Report statusReport = new Report();
LambdaLogger logger = context.getLogger();


Helper helper = new Helper();

try {

    S3EventNotificationRecord record = s3event.getRecords().get(0);
    String srcBucket = record.getS3().getBucket().getName();
    String srcKey = record.getS3().getObject().getKey().replace('+', ' ');

    srcKey = URLDecoder.decode(srcKey, "UTF-8");
    AmazonS3 s3Client = new AmazonS3Client();
    S3Object s3Object = s3Client.getObject(new GetObjectRequest(srcBucket, srcKey));
    logger.log("I am inside lambda function8");
    statusReport.setFileSize(s3Object.getObjectMetadata().getContentLength());
    logger.log("I am inside lambda function9");

    logger.log("S3 Event Received: " + srcBucket + "/" + srcKey);
    logger.log("I am inside lambda function10");

  BufferedReader br = new BufferedReader(new InputStreamReader(s3Object.getObjectContent())); 

        logger.log("I am inside lambda function13");
        CSVReader reader = new CSVReader(br);
        logger.log("I am inside lambda function14");

        AmazonDynamoDB dynamoDBClient = new AmazonDynamoDBClient();

        dynamoDBClient.setRegion(AWS_REGION);
        DynamoDB dynamoDB = new DynamoDB(dynamoDBClient);
        logger.log("I am inside DynamoDB");
        TableWriteItems energyDataTableWriteItems = new TableWriteItems(DYNAMO_TABLE_NAME);
        logger.log("I am inside DynamoDB-Table");
        List<Item> itemList = new ArrayList<Item>();

        String[] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            logger.log("I am inside while loop");
            Item newItem = helper.parseIt(nextLine);

            itemList.add(newItem);
        }

        for (List<Item> partition : Lists.partition(itemList, 25)) {
            energyDataTableWriteItems.withItemsToPut(partition);
            BatchWriteItemOutcome outcome = dynamoDB.batchWriteItem(energyDataTableWriteItems);
            logger.log("I am inside for loop");
            do {                

                Map<String, List<WriteRequest>> unprocessedItems = outcome.getUnprocessedItems();

                if (outcome.getUnprocessedItems().size() > 0) {
                    logger.log("Retrieving the unprocessed " + String.valueOf(outcome.getUnprocessedItems().size())
                            + " items.");
                    outcome = dynamoDB.batchWriteItemUnprocessed(unprocessedItems);
                }

            } while (outcome.getUnprocessedItems().size() > 0);

        }

        logger.log("Load finish in " + String.valueOf(System.currentTimeMillis() - startTime) + "ms");

        reader.close();
        br.close();
        //isr.close();
        //gis.close();
        s3Object.close();

        statusReport.setStatus(true);
    } catch (Exception ex) {
        logger.log(ex.getMessage());
    }

    statusReport.setExecutiongTime(System.currentTimeMillis() - startTime);
    return statusReport;
  }

 }

Helper.java

Публичный класс Хелпер {

/**
 * Parses the it.
 *
 * @param nextLine the next line
 * @return the item
 * @throws ParseException the parse exception
 */
public Item parseIt(String[] nextLine) throws ParseException {
    Item newItem = new Item();
    String Id = nextLine[0];

    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    // Specify your time zone
    df.setTimeZone(TimeZone.getTimeZone("GMT+8:00")); 

    Date parsedDate = df.parse(nextLine[1]);

    // Convert ms to seconds
    Long dateTime = parsedDate.getTime() / 1000; 

    newItem.withPrimaryKey("Id", Id, "Date", dateTime);
    return newItem;
   }
 }

Внутри консоли CloudWatch вывод выглядит enter image description here

Данные моего csv-файла выглядят как

enter image description here

Может кто-нибудь сказать мне, где я делаю ошибку? Как решить эту проблему?

...