Rob*_*ang 13 scala dataframe apache-spark
我将使用表达式向数据框添加新列.例如,我有一个数据帧
+-----+----------+----------+-----+
| C1 | C2 | C3 |C4 |
+-----+----------+----------+-----+
|steak|1 |1 | 150|
|steak|2 |2 | 180|
| fish|3 |3 | 100|
+-----+----------+----------+-----+
Run Code Online (Sandbox Code Playgroud)
我想创建一个带有表达式"C2/C3 + C4"的新列C5,假设需要添加几个新列,并且表达式可能不同并且来自数据库.
有没有办法做到这一点?
我知道如果我有一个像"2 + 3*4"的表达式,我可以使用scala.tools.reflect.ToolBox来评估它.
通常我使用df.withColumn来添加新列.
似乎我需要创建一个UDF,但是如何将columns值作为参数传递给UDF?特别是可能有多个表达需要不同的列计算.
Rap*_*oth 19
这可以使用从表达式expr创建Column:
val df = Seq((1,2)).toDF("x","y")
val myExpression = "x+y"
import org.apache.spark.sql.functions.expr
df.withColumn("z",expr(myExpression)).show()
+---+---+---+
| x| y| z|
+---+---+---+
| 1| 2| 3|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)
两种方法:
import spark.implicits._ //so that you could use .toDF
val df = Seq(
("steak", 1, 1, 150),
("steak", 2, 2, 180),
("fish", 3, 3, 100)
).toDF("C1", "C2", "C3", "C4")
import org.apache.spark.sql.functions._
// 1st approach using expr
df.withColumn("C5", expr("C2/(C3 + C4)")).show()
// 2nd approach using selectExpr
df.selectExpr("*", "(C2/(C3 + C4)) as C5").show()
+-----+---+---+---+--------------------+
| C1| C2| C3| C4| C5|
+-----+---+---+---+--------------------+
|steak| 1| 1|150|0.006622516556291391|
|steak| 2| 2|180| 0.01098901098901099|
| fish| 3| 3|100| 0.02912621359223301|
+-----+---+---+---+--------------------+
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21724 次 |
| 最近记录: |