Я делаю небольшой 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 вывод выглядит
Данные моего csv-файла выглядят как
Может кто-нибудь сказать мне, где я делаю ошибку? Как решить эту проблему?