繁体   English   中英

在 Spark / Scala 中减少时折叠错误

[英]Error on fold when reducing in Spark / Scala

鉴于我有一个包含一些列的数据框:

为什么这不起作用?

val output3b = input.withColumn("sum", columnsToConcat.foldLeft(0)((x,y)=>(x+y)))

notebook:16: error: overloaded method value + with alternatives:
 (x: Int)Int <and>
 (x: Char)Int <and>
 (x: Short)Int <and>
 (x: Byte)Int
cannot be applied to (org.apache.spark.sql.Column)
val output3b = input.withColumn("sum", columnsToConcat.foldLeft(0)((x,y)=>(x+y))) // does work
                                                                           ^
notebook:16: error: type mismatch;
found   : Int
required: org.apache.spark.sql.Column
val output3b = input.withColumn("sum", columnsToConcat.foldLeft(0)((x,y)=>(x+y)))  

但这行吗?

val output3a = input.withColumn("concat", columnsToConcat.foldLeft(lit(0))((x,y)=>(x+y)))

使用著名的 lit 函数似乎可以平滑一些事情,但我不知道为什么。

+---+----+----+----+----+----+------+
| ID|var1|var2|var3|var4|var5|concat|
+---+----+----+----+----+----+------+
|  a|   5|   7|   9|  12|  13|  46.0|
+---+----+----+----+----+----+------+

先决条件:

  • 根据编译器消息和 API 用法,我们可以推断columnsToConcatSeq[oassql.Column]或等效项。

  • 按照惯例, foldLeft方法需要映射到累加器(初始值)的函数。 这是Seq.foldLeft签名

     def foldLeft[B](z: B)(op: (B, A) ⇒ B): B
  • +在 Scala 中是一种方法,特别是.+调用的语法糖。

这意味着在以下情况下:

columnsToConcat.foldLeft(0)((x,y)=>(x+y))

columnsToConcat.foldLeft(0)((x: Int, y: Column) => x + y)

和你要求+的方法Int (推断类型累加器的- 0 ),并且由于Int -并且不存在+ (org.apache.spark.sql.Column) => Int方法Int (错误已列出了可用的方法,并且这种方法不存在也不足为奇),在当前范围内也不存在从Int到提供这种方法的任何类型的隐式转换。

在第二种情况下,你问

columnsToConcat.foldLeft(lit(0))((x,y)=>(x+y))

columnsToConcat.foldLeft(lit(0))((x: Column, y: Column) => x + y)

+指的是Column.+ (因为lit(0)类型是Column ),这样的方法, 它接受Any并返回Column ,存在。 由于Column <: Any满足Column <: Any类型约束

暂无
暂无

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

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