Spark数据帧-Scala中基于百分位数的CountDistinct

时间:2018-11-15 16:01:48

标签: scala apache-spark dataframe apache-spark-sql percentile

我的问题是这个。 我有一个从netflow记录中创建的自定义数据帧,其中包含columnMentS列(这是给定分钟内所有流的相同值),sourcePort和一些其他值,例如sourceIP,packetDelta等。 每行都有一行,一分钟内可能有很多行。 我想做的是计算一分钟间隔内所有流的不同端口的数量,但是我只想计算在90%百分位数之内的不同端口的数量,以了解它们的通用性。 这意味着我只希望90%最独特的端口数量和10%最不常见的端口数量对我不感兴趣。

我想我需要做的是:

  1. 每分钟创建一个单独的daframe。

    在这些结果数据框中:

  2. 按端口号分组。
  3. 计算这些组中的元素数量。
  4. 按元素数对这些组进行排序。
  5. 采取这些组中前90%并计算有多少组。这将在一个分钟内给出一个值 X ,即不同端口的90%。

    返回“外部”:

  6. 创建一列数据框,该列的列数将与分钟内用 X 值填充的分钟一样多。
  7. 将此列与我通过Minute进行分组和排序并根据我用于计算与此问题无关的其他值的逻辑进行汇总而创建的其他数据框结合起来。

  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列只是给定分钟内所有流的数据包的求和,我不需要帮助,它只是用来说明还存在其他列。

请注意,时间146000中的端口343不计入时间,因为在该时间窗口中,它仅出现在六分之一的流量中,因此属于最不常见的10%,因此不应计入。

0 个答案:

没有答案