[英]How to get the two nearest values in spark scala DataFrame
大家好我是 Spark scala 的新手。我想使用 spark scala 通过分区找到最接近的值。我的输入是这样的:
例如第一行:值 1 在 value2 列中介于 2 和 7 之间
+--------+----------+----------+
|id |value1 |value2 |
+--------+----------+----------+
|1 |3 |1 |
|1 |3 |2 |
|1 |3 |7 |
|2 |4 |2 |
|2 |4 |3 |
|2 |4 |8 |
|3 |5 |3 |
|3 |5 |6 |
|3 |5 |7 |
|3 |5 |8 |
我的 output 应该是这样的:
+--------+----------+----------+
|id |value1 |value2 |
+--------+----------+----------+
|1 |3 |2 |
|1 |3 |7 |
|2 |4 |3 |
|2 |4 |8 |
|3 |5 |3 |
|3 |5 |6 |
有人可以指导我如何解决这个问题。
我没有提供您似乎想要学习的代码答案,而是为您提供了伪代码和参考,以便您自己找到答案。
collect_list
在 value2 上聚合),以便您可以将所有 value2 收集到一个数组中。concat
) value1 to the collect_list
array)) 排序数组。array_position
) value1。splice
数组。 检索 ( array_position
) 结果之前的值和之后的值为此,您将需要window 个函数。
val window = Window
.partitionBy("id", "value1")
.orderBy(asc("value2"))
val result = df
.withColumn("prev", lag("value2").over(window))
.withColumn("next", lead("value2").over(window))
.withColumn("dist_prev", col("value2").minus(col("prev")))
.withColumn("dist_next", col("next").minus(col("value2")))
.withColumn("min", min(col("dist_prev")).over(window))
.filter(col("dist_prev") === col("min") || col("dist_next") === col("min"))
.drop("prev", "next", "dist_prev", "dist_next", "min")
我还没有测试过它,所以将它更多地看作是概念的说明,而不是现成可用的示例。
这是这里发生的事情:
window
来描述您的分组规则:我们希望行按前两列分组,并按每组中的第三列排序。prev
和next
列添加到 dataframe,它们分别包含组中上一行和下一行的value2
列的值。 (组中第一行的prev
将是 null,最后一行的next
将是 null - 没关系)。dist_prev
和dist_next
分别包含value2
与prev
一个值和next
值之间的距离。 (请注意,每一行的dist_prev
将与前一行的dist_next
具有相同的值)。dist_prev
的最小值,并将其添加为min
列(注意, dist_next
的最小值在构造上是相同的,因此我们这里只需要一列)。dist_next
或dist_prev
中具有最小值的行。 除非有多行彼此之间的距离相同,否则这会找到最紧密的对 - 这种情况未在您的问题中考虑,因此我们不知道在这种情况下您想要什么样的行为。 此实现将简单地返回所有这些行。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.