2014-10-20 64 views
0

我有一種情況,我需要某些在Spark庫版本1.1.0中可用的功能,但是我有兩個不同的平臺需要運行這個應用程序。一個使用Spark 1.1.0,另一個使用Spark 0.9.1。 Spark 1.1.1中提供的功能在Spark 0.9.1中不可用。是否有可能在scala中有編譯器特定的代碼段

也就是說,是否可以在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 

非常感謝

+0

我強烈建議使用星火1.0及以上的新開工項目(除非這不是由於外部約束的選件);從Spark 1.0開始,Spark爲其公共API提供了強大的二進制兼容性保證,所以1.0到1.1.0等都不會有這些問題。 – 2014-10-21 05:36:19

回答

4

有幾種選擇。

  1. 由於兩個Spark版本顯然不是二進制兼容的,所以您無論如何都需要提供兩個項目工件。創建一個簡單的通用API層,然後在多項目sbt構建中添加兩個瘦子項目,爲Spark版本提供該層。
  2. 使用sbt-buildinfo爲您的Spark版本生成編譯時符號,然後使用一個宏方法來粘貼上面兩種不同類型的方法調用,具體取決於Spark版本。
  3. 使用運行時反射
+0

解決方案2如何在maven中工作? sbt-buildinfo是全局控制還是每個項目? (是否可以添加到maven的scala編譯器/編譯插件?) – Ramdev 2014-10-22 14:08:18

+0

sbt-buildinfo顧名思義,是sbt的插件。這只是一個如何讓生成工具爲您提供有關生成代碼中庫的信息的示例。你也可以使用環境變量或屬性。我對Maven瞭解得不多,但我確信你可以將屬性傳遞給編譯器,以便它們可以在宏中使用。 – 2014-10-22 20:08:13

相關問題