Моя проблема в этом.У меня есть пользовательский фрейм данных, созданный из записей netflow, который содержит столбцы minuteMs (это то же самое значение для всех потоков в данную минуту), sourcePort и некоторые другие значения, такие как sourceIP, packetDelta и т. Д. Есть строка для каждого потока и можетбудет много потоков за одну минуту.То, что я хочу сделать, это вычислить количество отдельных портов для всех потоков в одноминутном интервале, однако я просто хочу подсчитать количество различных портов, которые попадают в 90-й процентиль, с точки зрения их общей распространенности.Это означает, что я просто хочу, чтобы 90% самых разных портов не интересовали меня.
Мне нужно сделать следующее:
Создайте отдельный daframe для каждой минуты.
В этих результирующих кадрах данных:
- Группировка по номеру порта.
- Подсчет количества элементов в этих группах.
- Сортируйте эти группы по количеству элементов.
Возьмите верхние 90% этих групп и посчитайте, сколько их.Это даст одно значение X , которое является 90-м процентилем отдельных портов за одну минуту.
Назад "снаружи":
- Создание одного столбца данных, который будетиметь столько столбцов, сколько минут заполнено значениями X .
Объединить этот столбец с другим фреймом данных, который я создал, группируя и упорядочивая по минутам и агрегируя на основе моей логикииспользуется для вычисления других значений, которые не имеют отношения к этому вопросу.
Окончательные результаты - это кадр данных с одной строкой для каждой минуты, причем один из его столбцов является желаемым числом верхних 90% наиболее распространенных различных исходных портов.
Проблема в том, что я очень новичок в Scala и у меня возникают проблемы даже при составлении кода для обозначенных шагов, но что более важно, я чувствую себя таккрайне неэффективно и может быть сделано гораздо более элегантно, я просто не знаю как.Любая помощь или указатели приветствуются.
Макет входного фрейма данных:
flowID minuteMs srcPortNumber packetDelta
0 146000 80 5
1 146000 90 8
2 146000 90 4
3 146000 90 4
4 146000 90 17
5 146000 90 22
6 146000 80 2
7 146000 80 3
8 146000 80 4
9 146000 343 3
10 152000 133 5
11 152000 80 31
12 152000 8081 4
Ожидаемый результат:
minuteMs 90thPercCountDistPorts packetCount
146000 2 72
152000 3 40
Столбец packetCount представляет собой просто суммированные пакеты из всех потоков за данную минуту,Мне не нужна помощь с этим, это просто для иллюстрации того, что будут присутствовать и другие столбцы.
Обратите внимание, что порт 343 во времени 146000 не учитывается, поскольку он появляется только в одном потоке из шести для этоговременное окно, следовательно, попадает в наименьшее общее 10% и как таковое не должно учитываться.