- Когда происходит какое-то событие, я записываю подробности события в базу данных aws rds mysql.
Класс событий имеет 3 поля.
частная строка EVENT;
частный длинный EVENT_ID;
частный LocalDateTime TS;
Раз в день я хочу получить все данные из базы данных mysql и записать их в файл паркета, который затем загрузю в корзину aws s3.
Я использую AvroParquetWriter для записи файла паркета, а для построения использую строку JSON. схему.
Это строка схемы json
Код: Выделить всё
private final String JSON_SCHEMA = "{"
+ "\"type\": \"record\","
+ "\"name\": \"activity\","
+ "\"fields\": ["
+ "{\"name\": \"EVENT\", \"type\": \"string\"},"
+ "{\"name\": \"EVENT_ID\", \"type\": \"long\"},"
+ "{\"name\": \"TS\", \"type\": \"long\", \"LogicalType\" : { \"Name\": \"TIMESTAMP\", \"IsAdjustedToUTC\": true, \"Unit\": \"MICROS\" }, \"ConvertedType\": \"TIMESTAMP_MICROS\"},"
+ "]"
+ "}";
Код: Выделить всё
List allData = activityRepository.findAll();Schema schema = new Schema.Parser().parse(JSON_SCHEMA);
try(ParquetWriter writer = AvroParquetWriter.builder(new org.apache.hadoop.fs.Path(FILE_LOCATION+FILE_NAME+count+PARQUET_EXTENSION))
.withSchema(schema)
.withCompressionCodec(CompressionCodecName.SNAPPY)
.withRowGroupSize(ParquetWriter.DEFAULT_BLOCK_SIZE)
.withPageSize(ParquetWriter.DEFAULT_PAGE_SIZE)
.build()) {
for(ActivityBean bean: allData) {
GenericRecord record = getGenericRecord(bean, schema);
writer.write(record);
}
}
private static GenericRecord getGenericRecord(ActivityBean bean, Schema schema) {
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss a").withZone(ZoneId.of(ZoneOffset.UTC.getId()));
GenericRecord record = new GenericData.Record(schema);
record.put("EVENT", bean.getCUSTOMER());
record.put("EVENT_ID", bean.getACTIVITY());
record.put("TS", DateTimeUtil.getEpochMicroseconds(bean.getTS()));
return record;
}
Код: Выделить всё
Timestamp. Используя приведенный выше json, я получаю тип данных int64 в поле ts со значением типа 1723535755205000, что является правильным временем эпохи, но образцы файлов паркета имеют тип данных для столбца ts как TimestampПриносим извинения за любую ошибку. Если потребуется предоставить дополнительную информацию, пожалуйста, дайте мне знать.
Подробнее здесь: https://stackoverflow.com/questions/788 ... boot-appli
Мобильная версия