带有替代方法的重载方法值选择

Posted

技术标签:

【中文标题】带有替代方法的重载方法值选择【英文标题】:overloaded method value select with alternatives 【发布时间】:2021-10-15 13:43:33 【问题描述】:

我正在尝试选择更多列并转换所有列,但我收到此错误

"重载的方法值选择与备选方案:(col: 字符串,列:字符串*)org.apache.spark.sql.DataFrame(列: org.apache.spark.sql.Column*)org.apache.spark.sql.DataFrame 不能 应用于 (org.apache.spark.sql.Column, org.apache.spark.sql.Column, 字符串)"

代码是这样的:

val result = df.select(
  col(s"$Constant.CS_exp.$Constant.DATI_CONTRATTO.$Constant.NUMERO_CONTRATTO").cast(IntegerType),
  col(s"$Constant.CS_exp.$Constant.DATI_CONTRATTO.$Constant.CODICE_PORTAFOGLIO").cast(IntegerType), 
  col(s"$Constant.CS_exp.$Constant.RATEALE.$Constant.STORIA_DEL_CONTRATTO"))

【问题讨论】:

我认为该错误意味着编译器不确定要使用哪种选择方法。你没有更多的错误信息(多行)吗? @Juh_ 是的,这是完整的错误:使用替代方法选择重载方法值:(col: String,cols: String*)org.apache.spark.sql.DataFrame (cols: org .apache.spark.sql.Column*)org.apache.spark.sql.DataFrame 不能应用于 (org.apache.spark.sql.Column, org.apache.spark.sql.Column, String) 【参考方案1】:

错误消息的最后一部分表示编译器找不到带有适合您代码的 api 的“选择”方法:select(Column, Column, String)

但是,编译器找到了 2 种可能的方法,但它们不适合:

select(col: String, cols: String*) select(cols: Column*)* 表示“任意数量”)

这个,我确定。

但是,我不明白为什么您给出的代码实际上是 select(Column, Column, Column),它适合 select(cols: Column*) api。出于某种原因,它认为最后一个参数是String。可能有些括号放错了

在这种情况下,我所做的就是拆分代码以验证类型:

val col1: Column = col(s"$Constant.CS_exp.$Constant.DATI_CONTRATTO.$Constant.NUMERO_CONTRATTO").cast(IntegerType)
val col2: Column = col(s"$Constant.CS_exp.$Constant.DATI_CONTRATTO.$Constant.CODICE_PORTAFOGLIO").cast(IntegerType)
val col3: Column = col(s"$Constant.CS_exp.$Constant.RATEALE.$Constant.STORIA_DEL_CONTRATTO")

val result = df.select(col1, col2, col3)

检查编译是否正常

【讨论】:

以上是关于带有替代方法的重载方法值选择的主要内容,如果未能解决你的问题,请参考以下文章

如何使用替代方法解决重载方法值寄存器,UDF Spark scala

错误重载方法值 regexp_replace 与替代品

scala.collection.immutable.Iterable[org.apache.spark.sql.Row] 到 DataFrame ?错误:使用替代方法重载了方法值 createDat

具有替代方法的重载方法 foreachBatch

Scala:方法的多个重载替代方案

Scala - 处理“方法的多个重载替代方案......定义默认参数”