Процентное число CountDistinct в кадре данных Spark - Scala - PullRequest
0 голосов
/ 15 ноября 2018

Моя проблема в этом.У меня есть пользовательский фрейм данных, созданный из записей netflow, который содержит столбцы minuteMs (это то же самое значение для всех потоков в данную минуту), sourcePort и некоторые другие значения, такие как sourceIP, packetDelta и т. Д. Есть строка для каждого потока и можетбудет много потоков за одну минуту.То, что я хочу сделать, это вычислить количество отдельных портов для всех потоков в одноминутном интервале, однако я просто хочу подсчитать количество различных портов, которые попадают в 90-й процентиль, с точки зрения их общей распространенности.Это означает, что я просто хочу, чтобы 90% самых разных портов не интересовали меня.

Мне нужно сделать следующее:

  1. Создайте отдельный daframe для каждой минуты.

    В этих результирующих кадрах данных:

  2. Группировка по номеру порта.
  3. Подсчет количества элементов в этих группах.
  4. Сортируйте эти группы по количеству элементов.
  5. Возьмите верхние 90% этих групп и посчитайте, сколько их.Это даст одно значение X , которое является 90-м процентилем отдельных портов за одну минуту.

    Назад "снаружи":

  6. Создание одного столбца данных, который будетиметь столько столбцов, сколько минут заполнено значениями X .
  7. Объединить этот столбец с другим фреймом данных, который я создал, группируя и упорядочивая по минутам и агрегируя на основе моей логикииспользуется для вычисления других значений, которые не имеют отношения к этому вопросу.

  8. Окончательные результаты - это кадр данных с одной строкой для каждой минуты, причем один из его столбцов является желаемым числом верхних 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% и как таковое не должно учитываться.

...