如何从其他列创建元组列?

时间:2018-09-05 20:35:32

标签: scala apache-spark

我有一列乐谱,我想为此乐谱创建一列乐队。

示例:分数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),在结尾保留(,但我也对两个]感到满意。

1 个答案:

答案 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()