Как создать файл паркета с полем типа отметки времени в приложении весенней загрузки?JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как создать файл паркета с полем типа отметки времени в приложении весенней загрузки?

Сообщение Anonymous »

Вот мой текущий сценарий.
  • Когда происходит какое-то событие, я записываю подробности события в базу данных aws rds mysql.
    Класс событий имеет 3 поля.
    частная строка EVENT;
    частный длинный EVENT_ID;
    частный LocalDateTime TS;

    Раз в день я хочу получить все данные из базы данных mysql и записать их в файл паркета, который затем загрузю в корзину aws s3.
Мое требование таково: мне нужно, чтобы тип данных поля TS в файле паркета был Timestamp. Все остальные подходы, которые я пробовал, в конечном итоге сохраняют данные метки времени в виде строки или в виде длинной строки.
Я использую 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;
}
Я не могу понять, каким должен быть тип поля для отметки времени в схеме json. У меня есть несколько примеров файлов паркета, которые говорят мне, как должен выглядеть мой файл паркета, и с помощью некоторых расширений кода vs я вижу, что ожидаемый тип данных столбца ts:

Код: Выделить всё

Timestamp. Используя приведенный выше json, я получаю тип данных int64 в поле ts со значением типа 1723535755205000, что является правильным временем эпохи, но образцы файлов паркета имеют тип данных для столбца ts как Timestamp
со значением, например 2024 -07-04 08:00:27.418474.
Приносим извинения за любую ошибку. Если потребуется предоставить дополнительную информацию, пожалуйста, дайте мне знать.

Подробнее здесь: https://stackoverflow.com/questions/788 ... boot-appli
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»