如何在Spark数据帧上进行非交换标量向量运算?

时间:2016-02-23 16:50:56

标签: scala apache-spark apache-spark-sql

使用spark数据框,假设我有一个double或int类型的列,我想对它应用标量操作。如果操作是可交换的(如加法),那很好,我可以做到以下几点:

df.withColumn("RESULT", df("col") + 10)

但是如果操作不是可交换的(比如除法)怎么办?

这样可行

df.withColumn("RESULT", df("col") / 10)

但这不起作用(错误是类型不匹配)

df.withColumn("RESULT", 10 / df("col"))

提供原始sql会起作用,但是你必须处理选择以前列的维护:

df.select("10 / col")

你也可以将标量值注入df,但是你必须放弃它。

有更简单的方法吗?

1 个答案:

答案 0 :(得分:3)

是的。只需使用SQL文字:

import org.apache.spark.sql.functions.lit

df.withColumn("RESULT", lit(10) / df("col"))

您还可以使用selectExpr

df.selectExpr("*", "10 / col as result")

expr

import org.apache.spark.sql.functions.expr

df.withColumn("RESULT", expr("10 / col"))