【发布时间】:2018-01-10 03:44:04
【问题描述】:
我有一个 Scala 应用程序,它有一个实现某些功能的 trait 和一个扩展 trait 的 class。
上面提到的类也有一个函数,它使用它的参数调用父 trait 中定义的函数。
我在使用 Scala 的 Spark + Kafka 实现中观察到了这一点。我猜这是某种设计模式,但我不知道是哪一种。是蛋糕图案吗?依赖注入模式?还是别的什么?
下面是我所指的代码:
trait SparkApplication {
def sparkConfig: Map[String, String]
def withSparkContext(f: SparkContext => Unit): Unit = {
val conf = new SparkConf()
sparkConfig.foreach { case (k, v) => conf.setIfMissing(k, v) }
val sc = new SparkContext(conf)
f(sc)
}
}
trait SparkStreamingApplication extends SparkApplication {
def withSparkStreamingContext(f: (SparkContext, StreamingContext) => Unit): Unit = {
withSparkContext { sc =>
val ssc = new StreamingContext(sc, Seconds(streamingBatchDuration.toSeconds))
ssc.checkpoint(streamingCheckpointDir)
f(sc, ssc)
ssc.start()
ssc.awaitTermination()
}
}
}
【问题讨论】:
-
继承模式?
-
and.... 为什么要在父特征上使用高阶函数?还有...为什么要在另一个函数中覆盖该函数?
-
@FelipeOliveiraGutierrez 它不是覆盖函数,它使用 lambda 参数进行调用,您可以像这样重写它,-
withSparkContext (sc => { ... })这将起作用 -
你是对的。我必须习惯这个 lambda...谢谢
-
不客气,查看topic 看看它是如何工作的
标签: scala apache-spark design-patterns