我有一列乐谱,我想为此乐谱创建一列乐队。
示例:分数623的列应为值// Remove query params
this.router.navigate([], {
queryParams: {
yourParamName: null,
youCanRemoveMultiple: null,
},
queryParamsHandling: 'merge'
})
。
在python中,我曾经这样做过:
(600, 625]
如何在Scala中做到这一点?到目前为止,我能想到的最好的方法是:
df['score_band_25'] = df['score'].apply(lambda x: '('+str((int((x-0.1)//25)*25))+', '+str(int((x-0.1)//25)*25+25)+']')
但这只给了我元组的第一部分,而且我找不到将.withColumn("score_band_25", floor(($"score"-0.1)/25)*25)
和floor(($"score"-0.1)/25)*25)
统一为字符串的方法。
理想情况下,我想在开头保留floor(($"score"-0.1)/25)*25+25)
,在结尾保留(
,但我也对两个]
感到满意。
答案 0 :(得分:2)
如果我正确理解了您的要求,则您尝试创建一个半开间隔的String类型的列,该列对应于Integer列的值–在这种情况下,您可以简单地使用concat()
来串联计算的间隔限制:
import org.apache.spark.sql.functions._
val df = Seq(
12, 149, 300, 623
).toDF("score")
val interval = 25
df.withColumn("score_band_" + interval, concat(
lit("("),
floor(($"score" - 0.1) / interval) * interval,
lit(", "),
floor(($"score" - 0.1) / interval) * interval + interval,
lit("]")
)).show
// +-----+-------------+
// |score|score_band_25|
// +-----+-------------+
// | 12| (0, 25]|
// | 149| (125, 150]|
// | 300| (275, 300]|
// | 623| (600, 625]|
// +-----+-------------+
请注意,concat
采用Column
类型的参数,因此文字字符串(例如"("
)需要lit()
。