jay*_*y s 3 scala apache-spark
我正在尝试使用 Columns 和 Doubles 执行一些基本操作,但如果不创建 UDF,我无法弄清楚如何执行此操作。
scala> import org.apache.spark.sql.functions.col
scala> import spark.implicits._
scala> val df = Seq(("A", 1), ("B", 2), ("C", 3)).toDF("col1", "col2")
df: org.apache.spark.sql.DataFrame = [col1: string, col2: int]
Run Code Online (Sandbox Code Playgroud)
我想找到 col2 的倒数,我认为这样做会是这样的:
scala> df.withColumn("col3", 1/col("col2")).show
Run Code Online (Sandbox Code Playgroud)
但这给出了这个错误:
<console>:30: error: overloaded method value / with alternatives:
(x: Double)Double <and>
(x: Float)Float <and>
(x: Long)Long <and>
(x: Int)Int <and>
(x: Char)Int <and>
(x: Short)Int <and>
(x: Byte)Int
cannot be applied to (org.apache.spark.sql.Column)
df.withColumn("col3", 1/col("col2")).show
Run Code Online (Sandbox Code Playgroud)
基本上是说你不能用左边的 Double 和右边的 Column 来执行除法(或任何其他运算符)。我能够弄清楚如何做到这一点的唯一方法是创建一个 UDF 并像这样应用它:
scala> def reciprocal(x: Double) : Double = {1/x}
reciprocal: (x: Double)Double
scala> val reciprocalUDF = spark.sqlContext.udf.register(
"reciprocalUDF", reciprocal _)
scala> df.withColumn("col3", reciprocalUDF(col("col2"))).show
+----+----+------------------+
|col1|col2| col3|
+----+----+------------------+
| A| 1| 1.0|
| B| 2| 0.5|
| C| 3|0.3333333333333333|
+----+----+------------------+
Run Code Online (Sandbox Code Playgroud)
但真的吗?UDF 是做这种事情的唯一方法吗?我不想每次必须做一些像除法这样的简单操作时都创建一个 UDF。
使用文字 Column
import org.apache.spark.sql.functions.lit
lit(1) / col("col2")
Run Code Online (Sandbox Code Playgroud)