如何做Spark 版本兼容

  • 时间:
  • 浏览:0

类似 要是,就能不能 直接使用了:

不幸的是,类似 API类似也在变化,譬如CodeAndComment要是我只有2.0才有的。

而到2.0后,将会基本都变更成

核心在最后一行,我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 声称返回的对象满足类似 签名:

我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 根据不同版本,动态加载对应的类,或者通过反射来调用最好的妙招,从而防止编译时错误。然而通过反射,就无法使用类似的代码了:

Spark 1.6 和2.0 实物API变化很大,然而对普通用户的API兼容性还是不错的。做版本兼容似乎并有的是一件容易的事情。什么都有当使用StreamingPro做机器学习相关工作时,我只兼容了Spark 1.6,2.0,而抛下了 1.5版本。或者对于普通的ETL以及流式计算,一一五个版本有的是支持的。

将API有变化的主次,独立出来。比如前面我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 提到的,对于Vector相关的API,1.6 和2.0 是不同的,没法我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 能不能 剥离出一一五个工程,每个工程适配对应的版本,或者发布jar包,在Maven中根据Profile机制,根据Spark版本引入不同的适配包。类似 最好的妙招相对来说比较繁琐。

很丑陋,对不对。这里还一一五个问题图片,我觉得udf返回的有的是UserDefinedFunction对象,然而我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 也是版本不兼容的,也要是我我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 无法让编译器选泽 返回的值是那此。我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 使用了另外一一五个Scala语法的技巧,如下:

一一五个我考虑过使用Spark 实物的CodeGen代码,大致如下:

将会 udf 函数要求不不能不能 推导出输入和返回值是那此。而将会通过反射,将会返回值我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 无法选泽 (有将会是org.apache.spark.ml.linalg.Vector,有的是将会是org.apache.spark.mllib.linalg.Vector),类似 要是就无法通过编译了。于是我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 改写了udf的是实现,然而类似 实现也遇到了挫折,将会中间用到比如UserDefinedFunction类,将会在不同的包中间了,我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 依然通过放射的方案防止:

在Spark 1.6 时,大主次机器学习相关的类使用的向量还是

无论你为什么会么会写,都没最好的妙招在Spark 1.6 和 Spark 2.0 共同表现正常,总爱会报错的,将会 Vector,Vectors等类的包名都居于了变化。

反射的最好的妙招(StreamingPro在使用的最好的妙招)

Scala 是能不能 很方便的动态源码的,对于或者代码也很简单,大体如下:

类似 效果和Spark Shell里是类似的,ref 是中间的一一五个返回值。正常状况,给你写两份代码,一份Spark 1.6. 一份Spark 2.0 ,或者在运行时决定编译那份代码。然而类似 最好的妙招一一五个缺点,尤其是在Spark中真难防止,将会compileCode 返回的值ref是须要被序列化到Executor的,则反序列化会是因为问题图片,将会中间生成的有些匿名类在Executor中不必居于。除此之外,类似 最好的妙招是实现兼容最有效的最好的妙招。

下面是我用来防止Vector 包名变化的代码:

在Spark中,给你通过 org.apache.spark.SPARK_VERSION 获取Spark的版本。我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 我们我们我们 定义一一五个类:

同理对应的Vectors object 也是。这就造成了一一五个比较大的困难,比如下面的代码就真难做到兼容了,切换Spark就无法通过编译: