繁体   English   中英

Scala Spark中的值和列操作,如何在Spark列中使用运算符剩余的值?

[英]Value and column operations in scala spark, how to use a value left of an operator with spark column?

我正在尝试对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]

我想找到col2的倒数,我想这样做是这样的:

scala> df.withColumn("col3", 1/col("col2")).show

但这会导致此错误:

<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

基本上说,您不能使用左手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|
+----+----+------------------+

但是真的吗 UDF是做这种事情的唯一方法吗? 我不想每次都要执行诸如除法之类的简单操作时都创建一个UDF。

使用文字Column

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

lit(1) / col("col2")

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM