美文网首页数客联盟
Spark源码中隐式转换的使用

Spark源码中隐式转换的使用

作者: Woople | 来源:发表于2016-11-02 17:29 被阅读0次

在spark中大量使用了隐式转换,例如mapWithState方法并不在DStream中,但是在官方的样例StatefulNetworkWordCount中却可以使用

val stateDstream = wordDstream.mapWithState(
               StateSpec.function(mappingFunc).initialState(initialRDD))

这就是因为在DStream的伴生对象中有一个隐式转换

  implicit def toPairDStreamFunctions[K, V](stream: DStream[(K, V)])
      (implicit kt: ClassTag[K], vt: ClassTag[V], ord: Ordering[K] = null):
    PairDStreamFunctions[K, V] = {
    new PairDStreamFunctions[K, V](stream)
  }

只要是KV类型的DStream才会转换为PairDStreamFunctions对象,而mapWithState方法就是在PairDStreamFunctions中定义的。

样例

下面用一个简单的例子说明一下这种隐式转换是如何使用的。

class PairDStreamFunctions{
  def mapWithState(item : String) = println("Save " + item + " from PairDStreamFunctions")
}

class OtherDStreamFunctions{
  def mapWithState(item : String) = println("Save " + item + " from OtherDStreamFunctions")
}

//定义类
class DStream[T: ClassTag]

//定义伴生对象
object DStream{
  //对于所有KV类型的DStream转换为PairDStreamFunctions对象
  implicit def toPairDStreamFunctions[K, V](s : DStream[(K, V)]) = new PairDStreamFunctions

  //对于所有单值类型的DStream转换为OtherDStreamFunctions对象
  implicit def toOtherDStreamFunctions[V](s : DStream[V]) = new OtherDStreamFunctions
}

object ImplicitDemo{
  def main(args: Array[String]): Unit = {

    val ds_kv = new DStream[(String, Int)]
    //由于定义的DStream为KV类型
    //所以会隐式转换为PairDStreamFunctions
    //也就是说下面调用的是PairDStreamFunctions中的mapWithState方法
    ds_kv.mapWithState("bread")


    val ds = new DStream[String]
    //由于定义的DStream为单值类型
    //所以会隐式转换为OtherDStreamFunctions
    //也就是说下面调用的是OtherDStreamFunctions中的mapWithState方法
    ds.mapWithState("jam")
  }
}

即使类DStream中没有定义任何的方法,DStream实例也可以使用mapWithState方法。样例的输出结果为

Save bread from PairDStreamFunctions
Save jam from OtherDStreamFunctions

总结

使用这种方式,可以根据泛型实现不同方法的调用。

相关文章

  • Spark源码中隐式转换的使用

    在spark中大量使用了隐式转换,例如mapWithState方法并不在DStream中,但是在官方的样例Stat...

  • C++中隐式类型转换

    1 operator隐式类型转换 1.1 std::ref源码中reference_wrapper隐式类型转换 在...

  • Spark使用总结-Scala

    Scala Spark使用 特殊引用 使用比如hive sql或者rdd转换toDF是通过隐式转换,需要增加相关的...

  • 2-JavaScript-的包装类和基本检测 隐式转换

    1 +new Date() --隐式转换 JavaScript的隐式转换,在使用“ + - | ~~ ”的时候会先...

  • scala-隐式机制及Akka

    隐式机制及Akka 隐式转换 隐式转换和隐式参数时Scala中两个非常强大的功能,利用隐式转换和隐式参数,可以提供...

  • Chapter 21《Implicit Conversions

    隐式转换和隐式参数 如果使用别人的代码库,无法进行修改,Scala进行扩展的方法是隐式转换和隐式参数。允许省略掉冗...

  • 【二】基本数据类型和Eclipse使用

    1.基本数据类型(4类8种) 2.强制类型转换 隐式转换隐式转换 显式转换显式转换 3.Eclipse使用介绍 E...

  • kotlin基础笔记之类型转换

    Kotlin没有隐式拓宽转换,如 Java 中 int 可以隐式转换为 long,必须要显式类型转换。 显式类型转...

  • 3.隐式转换

    1.scala中的类继承层次结构 2.Predef对象 下面是Predef的部分隐式转换源码:

  • C++类型转换

    C++的类型转换分为隐式转换和显式转换 隐式转换举例: int i=4; double d=i;//隐式转换 显式...

网友评论

    本文标题:Spark源码中隐式转换的使用

    本文链接:https://www.haomeiwen.com/subject/asgvuttx.html