如何根据列值创建范围列?

how to create range column based on a column value?

我在table中有示例数据,其中包含distance_travelled_in_meter,其中值是整数类型,如下所示:

distance_travelled_in_meter | 
--------------------------- |
                        500 | 
                        1221|
                        990 |
                         575|

我想根据列 distance_travelled_in_meter 的值创建范围。范围列的值具有 500 个间隔。 结果数据集如下:

distance_travelled_in_meter | range
--------------------------- |---------
                        500 | 1-500
                        1221|1000-1500
                        990 |500-1000
                         575|500-1000

对于值500,范围是1-500,因为它在500米以内,12211000-1500以此类推..

我尝试使用 Spark.sql.functions.sequence,但它采用了开始和停止列值,这不是我想要的并且希望在我上面提到的范围内。它还创建了一个从开始列值到停止列值的范围数组。

我正在使用 Spark2.4.2 和 Scala 2.11.12 非常感谢任何帮助。

您可以链接多个 when 您动态生成的表达式,如下所示:

val maxDistance = 1221 // you can get this from the dataframe

val ranges = (0 until maxDistance by 500).map(x => (x, x + 500))

val rangeExpr = ranges.foldLeft(lit(null)) {
  case (acc, (lowerBound, upperBound)) =>
    when(
      col("distance_travelled_in_meter").between(lowerBound, upperBound),
      lit(s"$lowerBound-$upperBound")
    ).otherwise(acc)
}

val df1 = df.withColumn("range", rangeExpr)