如何在 Spark 数据帧上进行非交换标量到向量的运算?
How to do non commutative scalar to vector operations on a Spark Data Frame?
对于 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 中,但是您必须将其删除。
有更简单的方法吗?
是的。只需使用 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"))
对于 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 中,但是您必须将其删除。
有更简单的方法吗?
是的。只需使用 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"))