如何解决scala trait中的冲突成员(org.slf4j.Logger/com.typesafe.scalalogging.Logger)
How to solve conflicting members in scala trait (org.slf4j.Logger/com.typesafe.scalalogging.Logger)
我正在使用 Spark 2.1.1。这是我的问题:
我在同一个目录中有 2 个文件,名为 tools。一个是main_process.scala,另一个是main_process_fun.scala。这些文件基本上是这样的:
1.- main_process.scala:
package mod.pack.tools
import x.y.spark.InitSpark
import com.typesafe.config.Config
trait main_process extends InitSpark with main_process_fun {
this: InitSpark =>
/**
* @param spark Initialized SparkSession
* @param config Config retrieved from args
*/
override def run(spark: SparkSession, config: Config): Int = {
logger.info("LOG")
implicit val sparkSes = spark
pre_defined_f1(config).flatMap(cfg => pre_defined_f2(cfg).flatMap(pre_defined_f3(_, cfg))) match {
case Success(_) =>
logger.info("OK")
case Failure(e) =>
logger.info("ERROR")
}
}
}
2.- main_process_fun.scala:
package mod.pack.tools
import mod.pack.tools.another_folder.another_trait
import com.typesafe.config.Config
trait main_process_fun extends another_trait with com.typesafe.scalalogging.LazyLogging {
def pre_defined_f1(conf: Config): Try[Config] = Try {
blablabla
}
def pre_defined_f2(conf: Config)(implicit spark: SparkSession): Try[DataFrame] = Try {
blablabla
logger.info("LOG")
}
def pre_defined_f3(conf: Config): Column = {
blablabla
logger.info("LOG")
}
}
我在尝试编译项目时遇到错误。错误说:
trait main_process inherits conflicting members
lazy value logger in trait LazyLogging of type org.slf4j.Logger and
lazy value logger in trait LazyLogging of type com.typesafe.scalalogging.Logger
(Note: this can be resolved by declaring an override in trait main_process.)
trait main_process extends InitSpark with main_process_fun {
我已经尝试过覆盖记录器,但我收到此错误消息:
lazy value logger has incompatible type
我也尝试导入main_process_fun而不是从main_process扩展它,但没有成功,我不知道是我做错了还是这个想法本身不好解决这个问题。
非常感谢你帮助解决这个继承冲突!
顺便说一句,记录器定义为:
package com.typesafe.scalalogging
trait LazyLogging extends scala.AnyRef {
@scala.transient
protected lazy val logger : com.typesafe.scalalogging.Logger = { /* compiled code */ }
}
错误消息说明 logger
有两个版本,一个在 org.slf4j.Logger
中,另一个在 com.typesafe.scalalogging.Logger
中。这些相互冲突,所以你需要放弃一个。 InitSpark
似乎使用了其中的第一个,因此在第二个特征中也使用相同的类型:
trait main_process_fun extends another_trait with org.slf4j.Logger {
我在 Tim 的帮助下找到了解决方案!
第一个:
trait main_process_fun extends another_trait {
然后我导入了:
import org.slf4j.LoggerFactory
最后,在每个使用记录器值的方法中,我声明:
val logger = LoggerFactory.getLogger(classOf[main_process_fun])
谢谢!
我正在使用 Spark 2.1.1。这是我的问题:
我在同一个目录中有 2 个文件,名为 tools。一个是main_process.scala,另一个是main_process_fun.scala。这些文件基本上是这样的:
1.- main_process.scala:
package mod.pack.tools
import x.y.spark.InitSpark
import com.typesafe.config.Config
trait main_process extends InitSpark with main_process_fun {
this: InitSpark =>
/**
* @param spark Initialized SparkSession
* @param config Config retrieved from args
*/
override def run(spark: SparkSession, config: Config): Int = {
logger.info("LOG")
implicit val sparkSes = spark
pre_defined_f1(config).flatMap(cfg => pre_defined_f2(cfg).flatMap(pre_defined_f3(_, cfg))) match {
case Success(_) =>
logger.info("OK")
case Failure(e) =>
logger.info("ERROR")
}
}
}
2.- main_process_fun.scala:
package mod.pack.tools
import mod.pack.tools.another_folder.another_trait
import com.typesafe.config.Config
trait main_process_fun extends another_trait with com.typesafe.scalalogging.LazyLogging {
def pre_defined_f1(conf: Config): Try[Config] = Try {
blablabla
}
def pre_defined_f2(conf: Config)(implicit spark: SparkSession): Try[DataFrame] = Try {
blablabla
logger.info("LOG")
}
def pre_defined_f3(conf: Config): Column = {
blablabla
logger.info("LOG")
}
}
我在尝试编译项目时遇到错误。错误说:
trait main_process inherits conflicting members
lazy value logger in trait LazyLogging of type org.slf4j.Logger and
lazy value logger in trait LazyLogging of type com.typesafe.scalalogging.Logger
(Note: this can be resolved by declaring an override in trait main_process.)
trait main_process extends InitSpark with main_process_fun {
我已经尝试过覆盖记录器,但我收到此错误消息:
lazy value logger has incompatible type
我也尝试导入main_process_fun而不是从main_process扩展它,但没有成功,我不知道是我做错了还是这个想法本身不好解决这个问题。
非常感谢你帮助解决这个继承冲突!
顺便说一句,记录器定义为:
package com.typesafe.scalalogging
trait LazyLogging extends scala.AnyRef {
@scala.transient
protected lazy val logger : com.typesafe.scalalogging.Logger = { /* compiled code */ }
}
错误消息说明 logger
有两个版本,一个在 org.slf4j.Logger
中,另一个在 com.typesafe.scalalogging.Logger
中。这些相互冲突,所以你需要放弃一个。 InitSpark
似乎使用了其中的第一个,因此在第二个特征中也使用相同的类型:
trait main_process_fun extends another_trait with org.slf4j.Logger {
我在 Tim 的帮助下找到了解决方案!
第一个:
trait main_process_fun extends another_trait {
然后我导入了:
import org.slf4j.LoggerFactory
最后,在每个使用记录器值的方法中,我声明:
val logger = LoggerFactory.getLogger(classOf[main_process_fun])
谢谢!