重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
Scala语言中如何结合demo和spark讲实现链式计算,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
创新互联是一家集网站建设,普定企业网站建设,普定品牌网站建设,网站定制,普定网站建设报价,网络营销,网络优化,普定网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。
一,什么是链式计算
1,一般开发习惯把事情封装到一个方法中;链式编程思想是把要做的事情封装到block中,给外部提供一个返回这个block的方法
2,链式编程思想方法特点:方法的返回值必须是block,block的参数是需要操作的内容,block的返回值是返回这个block的方法的调用者
二,举例说明
比如我们定义个case class Person
case classPerson(private valparent: Person = null,private valname: String = null, private varage: Int = 0 ) {
defsetName(newName: String) = newPerson( this,newName, this.age )
defsetAge(newAge: Int) :this.type= {
this.age = newAge;
this
}
defintroduce {parentIntroduce; println( s"Hello, my name is $name and I am $age years old." ) }
defparentIntroduce { if(parent!=null)parent.introduce }
}
那么,我们可以执行下面操作:
Person(null,"kitty",45) .setName("Peter").setAge(41).setName("Peter1").setAge(21).introduce
执行的结果
Hello, my name is kitty and I am 45 years old.
Hello, my name is Peter and I am 41 years old.
Hello, my name is Peter1 and I am 21 years old.
其实,我这里是有个陷阱,比如我现在换一种顺序调用(第一次调用setAge和setName互换),如下:
Person(null,"kitty",45) .setAge(41).setName("Peter").setName("Peter1").setAge(21).introduce
那么结果就会变成下面的样子:
Hello, my name is kitty and I am 41 years old.
Hello, my name is Peter and I am 41 years old.
Hello, my name is Peter1 and I am 21 years old.
三,总结
之所以会出现上面两种结果,是由于我们的setAge操作是执行之后返回的是对象本身,而setName操作又重新new 了一个对象。
由此,我们可以类比到RDD的操作。之前,群友问过这样一个问题:
RDD.repartiton(12)
RDD的分区为啥不变成12呢?
实际上是由于RDD的所有转换算子都是新生成了一个RDD,而不是将函数作用于自身。
其实,还有一种链式计算的实现方式是执行函数返回的是一个固定的类型,而不一定是调用者自身或者同父类的实现对象。比如,Dataset最终执行的实现函数的返回就是固定类型:RDD[InternalRow],而不是Dataset。
看完上述内容,你们掌握Scala语言中如何结合demo和spark讲实现链式计算的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注创新互联行业资讯频道,感谢各位的阅读!