18600329666

咨询技术专家

扫一扫
与技术专家在线沟通

Menu
spark机器学习开发之scala函数及基础语法
一、scala函数的基本使用
scala函数是编程思想是scala语言的核心,类似pytho语言,区别于java,C++等语言,大数据及机器学习框架spark源码中大量使用函数式变成方法

1.函数的定义
使用等等号定义,方法体使用{}
def hsmc(x:Int,y:Int) = {
var c = x*y;
c+1; //最后一行的结果为返回值
}
使用等等号定义,方法体只有简单的一句省略{}
def hsmcj(x:Int,y:Int) = x*y;
2.匿名函数
使用=>定义匿名函数,方法体只有简单的一句,调用时使用被赋值的变量或常量名作为方法名
val fun = (x:Int,y:Int)=>x*y;
使用=>定义匿名函数,方法体使用{},调用时使用被赋值的变量或常量名作为方法名
val fun = (x:Int,y:Int)=>{var c = x*y;c+22}
3.函数作为变量传递给另外一个函数
val funss = (x:Int) =>x+"hhhhhhh";
def getName(func:Int=>String,name:String){   func(name)   }
func:Int=>String为getName的形参,Int=>String为函数类型
调用:getName(funss,"羲和时代")
4.函数的柯里化
是把接受多个参数的函数变换成接受一个单一参数的函数,即将多个参数的函数 
转化为单个参数的函数链
def adds(x:Int,y:Int) = {x*y};
柯里化之后为
def adds = (x:int)(y:Int) = {x*y}
5.scala偏应用函数
Scala 偏应用函数是一种表达式,你不需要提供函数需要的所有参数,只需要提供部
分,或不提供所需参数。 
def cadd(x:Int)(y:Int) = x+y;
var plusone = cadd(1)_ //_匹配cadd(x:Int)后的所有内容 ,该函数完成了每次+1
plusone(2) //2+1
二、scala_的用法
1.导入包时,表示匹配所有,import java.util._类似于java的*
2.类成员的默认赋值(其实是不赋值让jvm去赋值)
class test{
var tv = _;
}
3.将集合的每个元素作为实参传递给函数
printArgs(List("a", "b"): _*) 
4. 作为类型通配符,类似于java泛型的?
def printList(list: List[_])
5.在模式匹配中表示所有,类似于*号
case _ =>"所有"
6.简写函数字面量
如果函数参数在函数体类只出现一次则可以用_代替
list.filter(_ > 0)等价于list.filter(x => x > 0)
二、scala操作spark初步
1.scala创建sparkContext
     引入包
     import org.apache.spark.SparkContext
     import org.apache.spark.SparkConf
     创建
     val conf = new SparkConf().setAppName("Simple Application")
     val sc = new SparkContext(conf)
2.scala spark读取txt文件内容(sc 为sparkContext)
     读取:var txt = sc.textFile("/springhdfs/stest.txt");   //存放在hdfs上,读取到的数据为rdd
     显示:txt.take(10),显示前10个
     rdd转化为Vectors
     import  org.apache.spark.mllib.{stat,linalg}    //引入统计与线性代数的包
     var datass = txt.flatMap(_.split(",")).map(value => linalg.Vectors.dense(value.toDouble))
     统计
     var ss=  stat.Statistics.colStats(datass)
      ss.max 最大值,ss.min 最小值
      或过滤
     datass .filter(_>100)过滤出大于100的数值