Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何拾取数据帧中某些行的相邻行,spark_Scala_Apache Spark - Fatal编程技术网

Scala 如何拾取数据帧中某些行的相邻行,spark

Scala 如何拾取数据帧中某些行的相邻行,spark,scala,apache-spark,Scala,Apache Spark,有一个包含2列的数据帧:[时间:时间戳,值:双精度] 这里我们定义了一个规则来查找值的异常值。除此之外,我们希望拾取包含异常值的行的相邻行。 例如,数据帧是: 红色的第7行包含我们定义的异常值,我们希望得到第4~10行,第7行旁边的3行 如何实现这一点?我想中间划船可能是另一种选择,但我不知道如何选择 谢谢 是的,您可以将窗口函数与行一起使用,如下所示: val df = Seq( (1,220), (2,220), (3,220), (4,220), (5,220),

有一个包含2列的数据帧:[时间:时间戳,值:双精度]

这里我们定义了一个规则来查找值的异常值。除此之外,我们希望拾取包含异常值的行的相邻行。 例如,数据帧是:

红色的第7行包含我们定义的异常值,我们希望得到第4~10行,第7行旁边的3行

如何实现这一点?我想中间划船可能是另一种选择,但我不知道如何选择


谢谢

是的,您可以将窗口函数与行一起使用,如下所示:

val df = Seq(
  (1,220),
  (2,220),
  (3,220),
  (4,220),
  (5,220),
  (6,230),
  (7,220),
  (8,220),
  (9,220),
  (10,220)
).toDF("time","value")

df
  .withColumn("is_outlier",$"value">220)
  .withColumn("outlier_region",max($"is_outlier").over(Window.orderBy($"time").rowsBetween(-3L,3L)))
  .show()
给出:

+----+-----+----------+--------------+
|time|value|is_outlier|outlier_region|
+----+-----+----------+--------------+
|   1|  220|     false|         false|
|   2|  220|     false|         false|
|   3|  220|     false|          true|
|   4|  220|     false|          true|
|   5|  220|     false|          true|
|   6|  230|      true|          true|
|   7|  220|     false|          true|
|   8|  220|     false|          true|
|   9|  220|     false|          true|
|  10|  220|     false|         false|
+----+-----+----------+--------------+

谢谢此外,如果有重叠怎么办?例如,时间6和7是异常值,在这种情况下,它们的公共邻居将被视为接近其中一个。以时间8为例,我们如何证明时间8是时间6和时间7的邻居,而不是其中一个?@Susu在这种情况下,使用数字而不是布尔值,使用sum而不是max,值为2意味着两个异常值在附近