Как лучше всего хранить данные из CSV в классе java? Один список объектов Row или один объект с вложенными объектами? - PullRequest
0 голосов
/ 26 мая 2020
Date,Locality,District,New Cases,Hospitalizations,Deaths
5/21/2020,Accomack,Eastern Shore,709,40,11
5/21/2020,Albemarle,Thomas Jefferson,142,19,4
5/21/2020,Alleghany,Alleghany,9,4,0
5/21/2020,Amelia,Piedmont,22,7,1
5/21/2020,Amherst,Central Virginia,25,3,0
5/21/2020,Appomattox,Central Virginia,25,1,0
5/21/2020,Arlington,Arlington,1763,346,89
... // skipped down to the next day
5/20/2020,Accomack,Eastern Shore,709,39,11
5/20/2020,Albemarle,Thomas Jefferson,142,18,4
5/20/2020,Alleghany,Alleghany,10,4,0
5/20/2020,Amelia,Piedmont,21,7,1
5/20/2020,Amherst,Central Virginia,25,3,0
5/20/2020,Appomattox,Central Virginia,24,1,0
5/20/2020,Arlington,Arlington,1728,334,81
5/20/2020,Augusta,Central Shenandoah,88,4,1
... // continued

У меня есть данные для штата в США, подобные приведенному выше, в CSV-файле, и я хотел бы провести некоторый анализ данных, чтобы я мог отправить их через API отдыха. Анализ данных, который я хотел бы провести, представляет собой различные агрегаты, такие как: общее количество случаев по штату по дате, общее количество случаев для всего штата, общее количество случаев, сгруппированных по округам, общее количество случаев для района по дате, общее количество случаев для округа. по дате, et c. Просто все основные c groupby, которые можно было сделать с этими данными.

Теперь моя проблема состоит в том, чтобы выяснить, как правильно хранить эти данные в java без базы данных. У меня есть одна успешная реализация с использованием списка объектов Row, где каждый объект Row содержит только одну строку в CSV. Затем, используя java s Stream api, я смог отфильтровать и получить некоторые из этих статистических данных. Затем я упаковываю эту статистику в один объект Row или List<Row> и отправляю в API для анализа в JSON. Это сработало нормально, но я считаю, что это не лучший способ.
Есть ли другой, более объектно-ориентированный способ использования столбца Date, District, County, Cases.

Я думал сделать что-то вроде этого:

class State {
     List<District> districtList;
     String name;
}

class District {
     List<County> countyList;
     String name;
}

class County {
     LocalDate date;
     String name;
     int cases;
     // more stuff
}

Затем я бы создал один State объект со списком District объектов, каждый со списком из многих County объекты, по одному на дату.

Это кажется излишним? Есть ли другой чистый способ чтения этого набора данных в структуру данных, которая позволяет легко агрегировать сводную информацию.

То, как я сейчас это делаю, теперь работает, но я ищу способ получше!

1 Ответ

2 голосов
/ 26 мая 2020

Судя по вашему описанию, ваш подход кажется здравым и правильно объектно-ориентированным. Однако без дополнительной информации (например, специфических агрегатов c, которые могут диктовать иное) кажется странным, что у вас будет несколько «повторяющихся» объектов «Графство» в ваших объектах District. Например:

[{"date":"5/21/2020","name":"Accomack"},
 {"date":"5/20/2020","name":"Accomack"}]

С объектно-ориентированного представления кажется, что вам нужен дополнительный уровень агрегации по «дате» (с каждой датой, содержащей список строк «графства»).

Одно соображение: если ваши агрегаты лучше соответствуют подходу к базе данных, я бы подумал, что каждую строку из исходных данных следует сохранять и запрашивать как / IS, фильтровать и сортировать с помощью лямбда-выражений Stream.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...