scala - scala 未指定值参数
问题描述
我想在 Spark 中扩展 SparkSession 类。我复制了这里部分复制的原始 SparkSession 的构造函数:
class SparkSession private(
@transient val sparkContext: SparkContext,
@transient private val existingSharedState: Option[SharedState],
@transient private val parentSessionState: Option[SessionState],
@transient private[sql] val extensions: SparkSessionExtensions)
extends Serializable with Closeable with Logging { self =>
private[sql] def this(sc: SparkContext) {
this(sc, None, None, new SparkSessionExtensions)
}
// other implementations
}
这是我扩展它的尝试:
class CustomSparkSession private(
@transient override val sparkContext: SparkContext,
@transient private val existingSharedState: Option[SharedState],
@transient private val parentSessionState: Option[SessionState],
@transient override private[sql] val extensions: SparkSessionExtensions)
extends SparkSession {
// implementation
}
但是我收到一个错误的SparkSession
错误extends SparkSession
:
未指定值参数:sc:SparkContext
我知道它来自this
原始 SparkContext 中的构造函数,但我不确定如何,或者我是否可以正确扩展它。有任何想法吗?
解决方案
当您编写时,class Foo extends Bar
您实际上是(1)为 class 创建一个默认(无参数)构造函数Foo
,以及(2)调用 class 的默认构造函数Bar
。
因此,如果你有类似 class 的东西Bar(bar: String)
,你不能只写class Foo extends Bar
,因为没有要调用的默认构造函数,你需要为 传递一个参数bar
。所以,你可以写类似
class Foo(bar: String) extends Bar(bar)
这就是您看到此错误的原因 - 您正在尝试为 调用构造函数SparkSession
,但没有为 传递任何值sc
。
但是你有一个更大的问题。private
您在旁边看到的那个关键字SparkSession
(以及之前的另一个关键字this
)意味着构造函数是......好吧......私有的。你不能叫它。换句话说,这个类不能被子类化(在sql
包之外),所以你应该寻找另一种方法来实现你想要做的事情。
推荐阅读
- python - 如何使用matplotlib并行绘制具有两种颜色的线
- html - 创建一个带有居中环绕文本的菱形形状
- wordpress - 在 WordPress 上创建 Meta-Box,添加 editTable.js 并保存字段数据
- docker - 仍在执行“RUN apt-get update && apt-get install -y apache2”
- java - 使用 SpEL 在 @Query 中获取活动配置文件
- python - 无法使用 XGBoost 模型(版本 1.5.0)运行 docker 映像
- javascript - 没有重载匹配此调用。最后一个重载在打字稿中给出了以下错误
- python - pytorch 无法使用 gpu
- node.js - TypeError:无法读取未定义的nodejs请求http的属性'0'
- r - 将字符串 2000 年 1 月 1 日上午 12:00 转换为 r 中的日期时间