Я провел некоторое исследование о том, как перенести сжатые данные S3 в Elasticsearch. На веб-сайте Aws есть информация, где вы можете создать лямбду, которая разархивирует файл и повторно загрузит его, а затем переместит в ES. Сейчас, поскольку у меня не слишком большой набор данных, я загружаю данные на локальный компьютер и отправляю их в ElasticSearch в правильном формате. Оба метода кажутся неэффективными, и мне интересно, есть ли способ разархивировать файл, затем переместить его в Elasticsearch без загрузки или повторной загрузки данных.
Прямо сейчас это мой код:
s3 = boto3.resource('s3')
s3.Bucket(bucket).download_file(key, 'download_path')
ip_pattern = re.compile('(\d+\.\d+\.\d+\.\d+)')
time_pattern = re.compile('\[(\d+\/\w\w\w\/\d\d\d\d:\d\d:\d\d:\d\d\s\+\d\d\d\d)\]')
message_pattern = re.compile('\"(.+)\"')
with gzip.open('download_path') as files:
data = ""
document = {}
for line in files:
line = line.decode("utf-8") # decode byte to str
ip = ip_pattern.search(line).group(0)
timestamp = time_pattern.search(line).group(0)
message = message_pattern.search(line).group(0)
document = { "ip": ip, "timestamp": timestamp, "message": message }
Если нет лучшего способа, я буду использовать приведенный выше код.