是否可以在scala中使用编译器特定的代码段

时间:2014-10-20 16:31:01

标签: scala apache-spark compiler-options

我有一种情况,我需要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

非常感谢

1 个答案:

答案 0 :(得分:4)

有几种选择。

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