0

我有一种情况,我需要 Spark 库版本 1.1.0 中可用的某些功能,但是我有两个不同的平台,我需要运行这个应用程序一个。一个使用 Spark 1.1.0,另一个使用 Spark 0.9.1。Spark 1.1.0 中可用的功能在 Spark 0.9.1 中不可用。

也就是说,是否可以在 scala 代码中包含一些编译器标志,以便在使用 Spark 1.1.0 编译时编译某些代码以及在使用 Spark 0.9.1 编译时。库另一段代码被编译?

像这样:

#ifSpark1.1.0
val docIdtoSeq: RDD[(String, Long)] = listOfDocIds.zipWithIndex()
#endifSpark1.1.0

#ifSpark0.9.1
    val docIdtoSeq: RDD[(String, Long)] = listOfDocIds.mapPartitionsWithIndex{case(partId,it) => it.zipWithIndex.map{case(el,ind) => (el,ind+partId*constantLong)}}
#endifSpark0.9.1

非常感谢

4

1 回答 1

4

有几种选择。

  1. 由于这两个 Spark 版本显然不是二进制兼容的,因此无论如何您都需要提供项目的两个工件。创建一个简单的通用 API 层,然后在多项目 sbt 构建中添加两个瘦子项目,为任一 Spark 版本提供该层。
  2. 使用sbt-buildinfo为您的 Spark 版本生成编译时符号,然后使用宏方法粘贴上述两种不同类型的方法调用,具体取决于 Spark 版本。
  3. 使用运行时反射
于 2014-10-20T17:12:37.003 回答