spark dataframe自定义udf返回数组

时间:2018-07-20 06:36:02

标签: sorting apache-spark dataframe intervals

单列样本数据集:

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。希望可以一​​次扫描完成这两个操作。然后对整个数据集进行另一次扫描以获取时间间隔,同样,我也无法获得第一个值。如果必须将其应用于多个列,则必须循环,否。扫描次数会增加。

1 个答案:

答案 0 :(得分:0)

一种可能的解决方案(更清洁):

让我们说您有一个数据框'df':

$scope.$broadcast('UiSelectDemo1');