单列样本数据集:
5.1,
4.9,
4.7,
4.6,
5,3.
5.4,
4.6,
5,
4.4,
4.9,
5.4,
4.8,
4.8,
4.3,
5.8
我希望它先按升序排序,然后间隔选择值并将其作为数组返回。
例如,如果时间间隔= 5,并且排序后的数据集是
4.3,
4.4,
4.6,
4.6,
4.7,
4.8,
4.8,
4.9,
4.9,
5,
5.1,
5,3.
5.4,
5.4,
5.8
它应该返回Array(4.3, 4.7, 5, 5.8)
。
有什么方法可以乐观地做到这一点吗?
预先感谢 沙克蒂
这是我尝试过的,但无法获得第一个值。
val interval = 5
val count = df.count() //15
val n = (count/interval).toInt //3
println(s"interval: $interval, count: $count, n: $n")
val window = Window.orderBy("col1")
val sorted = df.withColumn("rowId", functions.row_number().over(window))
sorted.show()
val sb = new StringBuilder
for (i <- 0 to n) {
val intervalPoint = interval * i
println(s"i: $i, intervalPoint: $intervalPoint")
sb.append(s"rowId == $intervalPoint or ")
}
sb.delete(sb.size - 3, sb.size - 1)
println(s"sb: ${sb.toString()}") //rowId == 0 or rowId == 5 or rowId == 10 or rowId == 15
val intervals = sorted.where(sb.toString()).select("col1").collectAsList()
println(s"intervals: $intervals") //[[4.7], [5.0], [5.8]]
如您所见,首先,它必须按col排序并附加一个行ID。希望可以一次扫描完成这两个操作。然后对整个数据集进行另一次扫描以获取时间间隔,同样,我也无法获得第一个值。如果必须将其应用于多个列,则必须循环,否。扫描次数会增加。
答案 0 :(得分:0)
一种可能的解决方案(更清洁):
让我们说您有一个数据框'df':
$scope.$broadcast('UiSelectDemo1');