Время прочтения: 2 мин.
Ранее мы разобрали, как организовать удобную и масштабируемую работу БД на Java (<Java и JDBC часть 1>, <Java и JDBC часть 2>). Теперь же пришло время познакомиться с удобным способом обработки больших данных на манер pandas, а именно – с joinery.
Для начала работы нужно создать новый maven проект и добавить в pom.xml всё необходимое для работы с joinery:
- Прописываем дополнительный maven репозиторий. Именно в нём находится артефакт joinery
<repositories>
<repository>
<id>JCenter</id>
<name>JCenter repo</name>
<url>https://jcenter.bintray.com/</url>
</repository>
</repositories>
2. Прописываем joinery и все другие зависимости проекта
<dependencies>
<dependency>
<groupId>joinery</groupId>
<artifactId>joinery-dataframe</artifactId>
<version>1.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-scratchpad</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.1</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>openxml4j</artifactId>
<version>1.0-beta</version>
</dependency>
</dependencies>
Перезагружаем maven проект для того, чтобы он сделал всю работу по загрузке необходимых артефактов. Скачиваем какой-нибудь датасет для работы с ним (в моём случае — это перечень возможных поселенцев на острове игрока из Animal Crossing) и переходим к написанию непосредственно кода.
Прежде чем начать как-то работать с данными, нужно их загрузить. С помощью joinery это делается следующим способом:
DataFrame df = DataFrame.readCsv(MainClass.class.getResourceAsStream("villagers.csv"));
System.out.println(df); //
И сразу выведем загруженные данные в консоль
Уже можно запустить этот код и увидеть в консоли примерно следующее:
Теперь, когда данные загружены, попробуем произвести несколько операций с ними:
// Получаем только имена поселенцев
var tempDf = df.retain(0);
System.out.println(tempDf);
// Получаем уникальные типы поселенцев
tempDf = df.retain("Species").unique("Species");
System.out.println(tempDf);
// Получаем только те строки, в которых Species=="Pig"
tempDf = df.select(new DataFrame.Predicate<Object>() {
@Override
public Boolean apply(List<Object> values) {
return values.get(1).toString().equals("Pig");
}
});
System.out.println(tempDf);
Т.к. это скорее обзорная статья, а не исчерпывающее руководство, с другими операциями над данными предлагается ознакомиться самостоятельно на страницах документации.
В заключении хочется напомнить, что для каждой задачи желательно использовать подходящий инструмент. Так, например, при работе с умеренно большими данными вполне хватит связки python и pandas, но, если данных становится слишком много, а вопрос произвольности встаёт всё острее – использовать Java будет не такой уж и плохой идеей. Тем более, что в ней имеются все те же инструменты с одним из которых мы сейчас и познакомились.