AWS DynamoDBに5Gbのcsvファイルをインポートします。
この時、DynamoDBへのインポートをPythonのみを利用して、1、2時間以内に終わらせたいです。
また、同時実行処理を考慮しているため、ファイルの分割などはできないものとします。
下記記事を参考に、5Gbのファイルをインポートしたところ、6時間もの時間を要しました。
こちらは、Pythonをコーディングすることで、より早くインポートすることができますでしょうか?
あまり、ビックデータには詳しくなく、、、ご教授いただきたいです。
https://dev.classmethod.jp/articles/csv-import-to-dynamodb-table/
```
import json
import boto3
import os
import csv
import codecs
import sys
s3 = boto3.resource('s3')
dynamodb = boto3.resource('dynamodb')
bucket = os.environ['bucket']
key = os.environ['key']
tableName = os.environ['table']
def lambda_handler(event, context):
#get() does not store in memory
try:
obj = s3.Object(bucket, key).get()['Body']
except:
print("S3 Object could not be opened. Check environment variable. ")
try:
table = dynamodb.Table(tableName)
except:
print("Error loading DynamoDB table. Check if table was created correctly and environment variable.")
batch_size = 100
batch = []
#DictReader is a generator; not stored in memory
for row in csv.DictReader(codecs.getreader('utf-8')(obj)):
if len(batch) >= batch_size:
write_to_dynamo(batch)
batch.clear()
batch.append(row)
if batch:
write_to_dynamo(batch)
return {
'statusCode': 200,
'body': json.dumps('Uploaded to DynamoDB Table')
}
def write_to_dynamo(rows):
try:
table = dynamodb.Table(tableName)
except:
print("Error loading DynamoDB table. Check if table was created correctly and environment variable.")
try:
with table.batch_writer() as batch:
for i in range(len(rows)):
batch.put_item(
Item=rows[i]
)
except:
print("Error executing batch_writer")
```
あなたの回答
tips
プレビュー