powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Субботняя бухтелка по Stream::reduce/collect
25 сообщений из 25, страница 1 из 1
Субботняя бухтелка по Stream::reduce/collect
    #39937437
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет котики.

Давайте раскачаем возможности и недостатки reduce/collect.

1) Дана табличка (из аэропорта)
Код: java
1.
2.
3.
4.
5.
     Column      |         Type          
-----------------+-----------------------+
 aircraft_code   | character(3)          |
 seat_no         | character varying(4)  |
 fare_conditions | character varying(10) |


Entity:
Код: java
1.
2.
3.
4.
5.
6.
@Data
public class Seat {
    private String aircraftCode;
    private String seatNo;
    private String fareConditions;
}



Образец данных.

aircraft_code seat_no fare_conditions 319 2A Business 319 2C Business 319 2D Business 319 2F Business 319 3A Business 319 3C Business 319 3D Business 319 3F Business 319 4A Business 319 4C Business

2) С помощью Stream-API получить из нее отчет по
количеству мест бизнес класса и других типов комфорта
с группировкой по aircraft_code.

Пример отчота.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
aircraft_code  |             fare_conditions             
---------------+-----------------------------------------
 319           | Business(20), Economy(96)
 320           | Business(20), Economy(120)
 321           | Business(28), Economy(142)
 733           | Business(12), Economy(118)
 763           | Business(30), Economy(192)
 773           | Business(30), Comfort(48), Economy(324)
 CN1           | Economy(12)
 CR2           | Economy(50)
 SU9           | Business(12), Economy(85)
(9 rows)



Исходные данные для пояснения https://postgrespro.ru/education/demodb

Go-go кодить!
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937461
Фотография Valentin Kolesnikov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Я не котик если чо.

Хорошего вам дня!
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937463
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как будет угодно.

Primary goal: посмотреть как выглядит аналитка на Stream::API

Secondary goal: тоже самое я хочу попробовать на Spark/Scala. Насколько будет лучше-хуже.
Если хватит сил и времени.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937464
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в стримах не эксперт, навалял как мог :) .

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Stream.of(
                new Seat("309", "1", "Business"),
                new Seat("309", "2", "Business"),
                new Seat("309", "3", "Economy"),
                new Seat("309", "4", "Comfort"),
                new Seat("C01", "1", "Economy"),
                new Seat("C01", "2", "Economy"),
                new Seat("C03", "1", "Business")
        ).collect(
                groupingBy(Seat::getAircraftCode, TreeMap::new,
                        groupingBy(Seat::getFareConditions, TreeMap::new, counting()))
        ).forEach(
                (flight, seatsByComfort) -> System.out.println(String.format("%s: %s", flight, seatsByComfort.entrySet().stream().reduce(
                                new StringBuilder(),
                                (sb, entry) -> sb.append(String.format("%s%s (%s)", sb.length() > 0 ? ", " : "", entry.getKey(), entry.getValue())),
                                StringBuilder::append)
                        )
                )
        );

Output:

309: Business (2), Comfort (1), Economy (1)
C01: Economy (2)
C03: Business (1)
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937467
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
        ).forEach(
                (flight, seatsByComfort) -> System.out.println(String.format("%s: %s", flight, seatsByComfort.entrySet().stream().reduce(
                                new StringBuilder(),
                                (sb, entry) -> sb.append(String.format("%s%s (%s)", sb.length() > 0 ? ", " : "", entry.getKey(), entry.getValue())),
                                StringBuilder::append)
                        )
                )
        );



Шикарно. Только вот эта последняя часть - некрасивая. Но здесь я виноват т.к. поставил задачу вида отчот.

Было-бы хорошо получить не поток символов StringBuilder а поток энтитей виде строка отчота.
Я понимаю что эта глупая группировка

Код: java
1.
773           | Business(30), Comfort(48), Economy(324)



ломает естественный порядок.

Давайте упростим задачу здесь. Но поставим немного другой - более табличный отчот.

Пускай будет 3 строки вида.

Код: java
1.
2.
3.
773           | Business(30), 
773           | Comfort(48), 
773           | Economy(324)
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937475
SpringMan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
На скале наваял:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
  def simpleGroup(): Unit = {
    case class Seat(aircraftCode: String, seatNo: String, fareConditions: String)

    Seq(
      Seat("309", "1", "Business"),
      Seat("309", "2", "Business"),
      Seat("309", "3", "Economy"),
      Seat("309", "4", "Comfort"),
      Seat("C01", "1", "Economy"),
      Seat("C01", "2", "Economy"),
      Seat("C03", "1", "Business")
    )
      .groupBy(seat => (seat.aircraftCode, seat.fareConditions))
      .map { case ((aircraftCode, fareConditions), seats) => (aircraftCode, fareConditions, seats.length) }
      .foreach(println)
  }


Для спарка почти буква в букву будет
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937479
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну если у нас есть "строка отчета", то, допустим, так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 Stream.of(
                new Seat("309", "1", "Business"),
                new Seat("309", "2", "Business"),
                new Seat("309", "3", "Economy"),
                new Seat("309", "4", "Comfort"),
                new Seat("C01", "1", "Economy"),
                new Seat("C01", "2", "Economy"),
                new Seat("C03", "1", "Business")
        ).collect(
                groupingBy(Seat::getAircraftCode, TreeMap::new,
                        groupingBy(Seat::getFareConditions, TreeMap::new, counting()))
        ).entrySet()
              .stream()
              .flatMap(entry -> entry.getValue().entrySet().stream().reduce(
                      new ArrayList<ReportEntry>(),
                      (arr, val) -> combine(arr, new ReportEntry(entry.getKey(), String.format("%s (%s)", val.getKey(), val.getValue()))),
                      this::combine).stream())
              .forEach(System.out::println);

Output (поленился переписывать toString или раширять последний forEach)

ReportEntry(aircraftCode=309, fareConditions=Business (2))
ReportEntry(aircraftCode=309, fareConditions=Comfort (1))
ReportEntry(aircraftCode=309, fareConditions=Economy (1))
ReportEntry(aircraftCode=C01, fareConditions=Economy (2))
ReportEntry(aircraftCode=C03, fareConditions=Business (1))



пришлось еще ввести две функции combine для reduce, чтобы лаконично добавлять элемент к List и тут же этот List возвращать, по-моему в java se по-другому никак короче не запишешь (ну и вообще рабочий код я бы в таком виде не оставлял - как минимум flatmap и reduce в отдельные функции с говорящими названиями)
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937491
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
О спасибо. Надо теперь что-то придумать с WINDOWS functions. Но применительно к аэропорту я ничего не могу
придумать материального и имеющего смысл.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937624
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha
ну если у нас есть "строка отчета", то, допустим, так

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
 Stream.of(
                new Seat("309", "1", "Business"),
                new Seat("309", "2", "Business"),
                new Seat("309", "3", "Economy"),
                new Seat("309", "4", "Comfort"),
                new Seat("C01", "1", "Economy"),
                new Seat("C01", "2", "Economy"),
                new Seat("C03", "1", "Business")
        ).collect(
                groupingBy(Seat::getAircraftCode, TreeMap::new,
                        groupingBy(Seat::getFareConditions, TreeMap::new, counting()))
        ).entrySet()
              .stream()
              .flatMap(entry -> entry.getValue().entrySet().stream().reduce(
                      new ArrayList<ReportEntry>(),
                      (arr, val) -> combine(arr, new ReportEntry(entry.getKey(), String.format("%s (%s)", val.getKey(), val.getValue()))),
                      this::combine).stream())
              .forEach(System.out::println);

Output (поленился переписывать toString или раширять последний forEach)

ReportEntry(aircraftCode=309, fareConditions=Business (2))
ReportEntry(aircraftCode=309, fareConditions=Comfort (1))
ReportEntry(aircraftCode=309, fareConditions=Economy (1))
ReportEntry(aircraftCode=C01, fareConditions=Economy (2))
ReportEntry(aircraftCode=C03, fareConditions=Business (1))



пришлось еще ввести две функции combine для reduce, чтобы лаконично добавлять элемент к List и тут же этот List возвращать, по-моему в java se по-другому никак короче не запишешь (ну и вообще рабочий код я бы в таком виде не оставлял - как минимум flatmap и reduce в отдельные функции с говорящими названиями)

неплохо
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937697
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
Давайте раскачаем возможности и недостатки reduce/collect.

Делаю всё на map/reduce (правда в js) брат жив. Да, это дольше, чем написать group by и данные должны влазить в память целиком, НО возможностей и пространства для манёвров гораздо больше, чем может дать sql.
Быдлокод:
Код: javascript
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
var rec = function(code, seat, cond) {return {code, seat, cond}};
var log = console.log;
var data = [
    rec("309", 1, "buisness"),
    rec("309", 2, "buisness"),
    rec("309", 3, "economy"),
    rec("309", 4, "confort"),
    rec("C01", 1, "economy"),
    rec("C01", 2, "economy"),
    rec("C03", 1, "buisness")
]
var report = data.reduce((s,v)=>{
    var r = s[v.code] = s[v.code] || {};
    r[v.cond] = r[v.cond] || 0;
    r[v.cond]++;
    return s;
},{});
Object.entries(report).forEach(([code,v])=>{
    var sums = Object.entries(v).map(([cond, sum]) s=>`${cond} (${sum})).join(",");
    log(`${k} : ${sums}`);
});
/*
309 : buisness(2),economy(1),confort(1)
C01 : economy(2)
C03 : buisness(1)
*/



upd: для Стасяна: это не значит, что sql не нужен вообще. Тупая группировка на sql отработает быстрее, чем ты сначала будешь гнать всю таблицу по сети, потом её парсить, гнать в pojo и через стрим.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937719
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster,
Конечно. Больше кода в аппСервере или бд определяется чисто _политикой_ организации где работаешь.
Можно и так и так.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937728
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster


upd: для Стасяна: это не значит, что sql не нужен вообще. Тупая группировка на sql отработает быстрее, чем ты сначала будешь гнать всю таблицу по сети, потом её парсить, гнать в pojo и через стрим.

вопрос в том,насколько часто ты будешь лазить в базу- обычно все это кладется в кэш и уже оттуда тянется
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937729
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
обычно все это кладется в кэш

Ну если у тебя цветочный магазин на 10 позиций, то, конечно, можно всё засунуть в кэш.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937732
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
кладется

Вадя в любой проект кладет сокеты.
Ты получается в любой "попадание в кэш".
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937777
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster, SQL может работать плохо когда мы транспонируем табличку и роли строк-столбцов
меняются местами. В этом случае императивный ЯП - лучше. Или не дай бог идет алгебра матриц.

В остальных случаях разработчик отчотов быстрее справляется с задачей на SQL чем даже
продвинутый кодер на обычном ЯП которому только ПРЕДСТОИТ реализовать какую-то
функцию квартиля или процентиля с ROLLUP в то время как СКЛ-щик имеет это сразу
из коробки и в виде DSL.

Но топи не про это. Я сейчас ковыряю Spark. И пытаюсь понять что я НЕ смогу на нем сделать.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937790
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
ЯП которому только ПРЕДСТОИТ реализовать какую-то
функцию квартиля или процентиля с ROLLUP в то время как СКЛ-щик имеет это сразу
из коробки и в виде DSL.

Так они тоже могут быть готовые в составе какой-нибудь либы и всё что надо это перегнать структуры в нужный вид. И потом, зайти тут в раздел субд и попробуй сходу понять что делает их 10-и этажный sql запрос, причём там нет какой-то тёмной магии анал.функций, а всякая банальщина типа выборки по интервалам или наркомания типа сложить последнюю запись с первой и отнять вторую. На тупой императивщене это просто выглядит понятнее и поддерживается легче а в sql портянки даже тот sql кодер уже через месяц не захочет лезть и начнёт мазаться, что "ничего нельзя сделать" (наблюдаю эту картину регулярно).

mayton
И пытаюсь понять что я НЕ смогу на нем сделать.

То, для чего он совсем не предназначен и то, что не влезет в память. Последнее решается разбиением запроса на куски и я не могу придумать схожу что-то настолько жирное что надо было бы делать целиком в субд.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937797
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сортировки и группировки. Это убивает память. Двигатели которые инкапсулированы в dbms обычно
знают об этом и используют внешние структуры данных (temporary-tables) для генерации резалт-сета
внутри этих структур. Программисты императивных языков берут коллекции и обычно видят OOM
пост-фактум. Тоесть когда это уже случилось.

Но не будем о грустном. Сегодня мне надо сделать шаблончик проекта на ApacheSpark под амазонский
сервис.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937805
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А как из этого Аэропорта посохранять таблички в CSV ? Кто постгресщик?
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937808
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton
А как из этого Аэропорта посохранять таблички в CSV ? Кто постгресщик?
разверни вопрос. CSV это текстовый формат файла.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937812
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
asv79
обычно все это кладется в кэш

Ну если у тебя цветочный магазин на 10 позиций, то, конечно, можно всё засунуть в кэш.

скажи это разрабам микросервисов
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937817
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
скажи это разрабам микросервисов
а ты не упоминай в приличном обществе этот флейм-слово.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937823
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
asv79
скажи это разрабам микросервисов
а ты не упоминай в приличном обществе этот флейм-слово.

сказать так ,что кеширование применяется только в цветочных магазинах с 10 запросами в минуту мог только такой же дилетант как ты петро)))
ваш выход)
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937825
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79,
Ты вроде один такой, с цветочным магазином.
На сегодня ты уже перестал кодить.
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937832
Фотография asv79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PetroNotC Sharp
asv79,
Ты вроде один такой, с цветочным магазином.
На сегодня ты уже перестал кодить.

петро ты от жизни отстал
давно уже накожено и перекожено)
...
Рейтинг: 0 / 0
Субботняя бухтелка по Stream::reduce/collect
    #39937835
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asv79
PetroNotC Sharp
asv79,
Ты вроде один такой, с цветочным магазином.
На сегодня ты уже перестал кодить.

петро ты от жизни отстал
давно уже накожено и перекожено)
22099641
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Субботняя бухтелка по Stream::reduce/collect
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]