本文打算对这小段时间学习 scala 以及 spark 编程技术做个小结,一来温故而知新,而来为以后查阅方便
spark scala 入门小例子 
文本文件  UserPurchaseHistory.csv:
John,iPhone Cover,9.99
John,Headphones,5.49
Jack,iPhone Cover,9.99
Jill,Samsung Galaxy Cover,8.95
Bob,iPad Cover,5.49 下面开始读取文件进行分析 package com.ghc.bigdata import org.apache.spark.{SparkConf, SparkContext} /**
* Created by Yu Li on 12/5/2017.
*/
object ScalaApp {
def main(args:Array[String]):Unit={
val sparkConf=new SparkConf()
sparkConf.setMaster("local[2]")
sparkConf.setAppName("Scala App")
val sc=new SparkContext(sparkConf)
val textFromFile=sc.textFile("./src/main/scala/UserPurchaseHistory.csv")
val data=textFromFile.map(x=>x.split(",")).map(p=>(p(0),p(1),p(2)))
//购买次数
val countOfPurchase=data.count()
//多少不同客户购买过商品
val distinctCountOfPurchase=data.map(x=>x._1).distinct.count()
println("共有 "+distinctCountOfPurchase+" 不同客户购买过商品")
println("共有 "+data.map{case(user,product,price)=>user}.distinct.count()+" 不同客户购买过商品")
val totalRevenue=data.map{case(user,product,price)=>price.toDouble}.sum() //只有 double才能 sum
println("totalRevenue: "+totalRevenue)
//最畅销的产品,可以想到对产品分组求和 reduceByKey
val mostPoplularProduct=data.map{case(user,product,price)=>(product,1)}.reduceByKey(_+_).collect().sortBy(-_._2) // 负是倒序的意思
println(mostPoplularProduct.mkString(","))
println("mostPoplularProduct: "+mostPoplularProduct(0)) //mostPoplularProduct(0) println("共购买:"+countOfPurchase+" 件商品")
println("共有 "+data.map{case(user,product,price)=>user}.distinct.count()+" 不同客户购买过商品")
println("总收入: "+totalRevenue)
println("最畅销的产品是: %s 购买了 %d 件".format(mostPoplularProduct.take(1)(0)._1,mostPoplularProduct.take(1)(0)._2))
}
} package com.ghc.bigdata
import org.apache.spark.{SparkConf,SparkContext}
/**
* Created by Yu Li on 12/6/2017.
*/
object SparkScalaApp {
def main(args:Array[String]):Unit={
val sparkConf:SparkConf=new SparkConf()
sparkConf.setAppName("Spark Scala App")
sparkConf.setMaster("local[2]")
val sc:SparkContext=new SparkContext(sparkConf)
val fileName:String="./src/main/scala/UserPurchaseHistory.csv"
printResult(sc,fileName)
}
/*println("共购买:*/
def printResult(sc:SparkContext,fileName:String):Unit={
// 共购买多少产品
val rawRDD=sc.textFile(fileName).map(x=>x.split(",")).map(purchase=>(purchase(0),purchase(1),purchase(2)))
val countOfPurchase=rawRDD.count()
// 共有多少不同客户购买产品
val countOfDistinctPurchase=rawRDD.map{case(user,item,price)=>user}.distinct.count()
// 总收入
val sumRevenue=rawRDD.map{case(user,item,price)=>price.toDouble}.sum()
//每一类产品收入
val sumGroupByItemRevenue=rawRDD.map{case(user,item,price)=>(item,price.toDouble)}.reduceByKey(_+_).sortBy(-_._2).collect()(0) //按照每一类商品收入倒序取最大的那个值
// 最畅销的产品
val mostPopularItem=rawRDD.map{case(user,item,price)=>(item,1)}.reduceByKey(_+_).sortBy(-_._2).collect()(0) println("共购买 "+countOfPurchase+" 件商品")
println("共有 "+countOfDistinctPurchase+" 个不同用户购买过商品")
println("总收入 "+sumRevenue)
println("收入最高的商品是 %s 卖了 %.2f 钱".format(sumGroupByItemRevenue._1,sumGroupByItemRevenue._2))
println("最畅销的产品是 %s 卖了 %d 件".format(mostPopularItem._1,mostPopularItem._2))
}
}
 
package com.ghc.bigdata
import org.apache.spark.{SparkConf,SparkContext}
/**
* Created by Yu Li on 12/6/2017.
*/
object SparkScalaApp {
def main(args:Array[String]):Unit={
val sparkConf:SparkConf=new SparkConf()
sparkConf.setAppName("Spark Scala App")
sparkConf.setMaster("local[2]")
val sc:SparkContext=new SparkContext(sparkConf)
println("2 在List中的位置: "+getPosition(List(1,2,3),2))
for(i<- map[Int,String](List(1,2,3),{num:Int=>num+"2"})){
println(i)
}
}
def getPosition[A](l:List[A],v:A): Int ={
l.indexOf(v)
}
def map[A,B](list:List[A],func: A=>B)=list.map(func) }

scala 简单泛型小例子

spark 线性回归算法预测谋杀率

package com.ghc.bigdata
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.sql.{DataFrame, SQLContext, SparkSession}
import org.apache.log4j.{Level, Logger}
/**
* Created by Yu Li on 12/7/2017.
*/
// 因为 ml 推荐使用 DataFrame 所以下面开始都用 DataFrame
object LRDemo {
def main(args:Array[String]):Unit={
//屏蔽日志
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.eclipse.jetty.server").setLevel(Level.OFF)
//设置 Spark 模拟环境
val sparkConf=new SparkConf().setAppName("Regression Demo").setMaster("local[2]")
val sc=new SparkContext(sparkConf) //真实文本数据转化为 VectorDataFrame 准备真实数据集
val realFile="./src/main/scala/com/ghc/bigdata/LR_data"
val delimeter=","
val vecDF_real=transform2VectorDFFromFile(sc,realFile,delimeter)
println("start print df from real: ")
println(vecDF_real.collect.mkString("\t")) //预测文本数据转化为 VectorDataFrame 准备预测数据集 可以 select 的
val predictFile="./src/main/scala/com/ghc/bigdata/LR_data_for_predict"
val vecDF_predict=transform2VectorDFFromFile(sc,predictFile,delimeter)
println("start print df from predict: ")
println(vecDF_real.collect.mkString("\t"))
// res: 1 行 50 列 , 每列 里又是 1 行 2 列 左边,由 select 可知 [ [A]] A 里的是 feature 列
// [3615.0,3624.0,2.1,69.05,15.1,41.3,20.0,50708.0,[3615.0,3624.0,2.1,69.05,41.3,20.0,50708.0]] //建立模型预测 谋杀率 //设置线性回归参数
val lr=new LinearRegression()
lr.setFeaturesCol("features") // 设置特征列
lr.setLabelCol("Murder") // 设置需要被预测的列
lr.setFitIntercept(true) // 数据中心化
lr.setMaxIter(20) // 设置迭代次数
lr.setRegParam(0.4) // 设置正则化参数
lr.setElasticNetParam(0.8) //设置弹性化混合参数 // 将真实数据 训练集合代入训练
val lrModel=lr.fit(vecDF_real) // 代入真实数据
lrModel.extractParamMap() // 输出模型全部参数
println(s"coefficients: ${lrModel.coefficients},intercept: ${lrModel.intercept}") //对训练结果进行评价
val trainingSummary=lrModel.summary
println(s"numIterations: ${trainingSummary.totalIterations}") //总迭代次数
println(s"objectiveHistory: ${trainingSummary.objectiveHistory.toList}") //每次迭代损失?依次递减
trainingSummary.residuals.show()// 残差
println(s"RMSE: ${trainingSummary.rootMeanSquaredError}") //均方根差 RMSE(均方根、标准差)
println(s"r2: ${trainingSummary.r2}") //决定系数 val predictions: DataFrame = lrModel.transform(vecDF_predict) // 用同一个模型来训练
println("输出预测结果")
val predict_result: DataFrame =predictions.selectExpr("features","Murder", "round(prediction,1) as prediction")
predict_result.foreach(println(_))
sc.stop()
} //定义一个从文件中获取 VectorDataFrame 的方法,因为实际文本数据与预测文本数据都需要,便于复用
def transform2VectorDFFromFile(sc:SparkContext,fileName:String,delimeter:String):DataFrame={
val sqc=new SQLContext(sc) // SQLContext是过时的,被 SparkSession 替代
val raw_data=sc.textFile(fileName)
val map_data=raw_data.map{x=>
val split_list=x.split(delimeter)
(split_list(0).toDouble,split_list(1).toDouble,split_list(2).toDouble,split_list(3).toDouble,split_list(4).toDouble,split_list(5).toDouble,split_list(6).toDouble,split_list(7).toDouble)}
val df=sqc.createDataFrame(map_data)
val data = df.toDF("Population", "Income", "Illiteracy", "LifeExp", "Murder", "HSGrad", "Frost", "Area")
val colArray = Array("Population", "Income", "Illiteracy", "LifeExp", "HSGrad", "Frost", "Area")
val assembler = new VectorAssembler().setInputCols(colArray).setOutputCol("features")
val vecDF: DataFrame = assembler.transform(data)
vecDF
}
}

scala 基础到高阶的更多相关文章

  1. scala中的高阶函数

    版权申明:转载请注明出处. 文章来源:http://bigdataer.net/?p=332 排版乱?请移步原文获得更好阅读体验 1.scala中的函数 scala是一门面向对象和函数式编程相结合的语 ...

  2. Python 编程基础之高阶函数篇(一)

      高阶函数:能接受函数作为参数的函数. 如: f=abs def   add(x,y,f): return f(x)+f(y) 如果我们用:add(-5,9,f)来调用该高阶函数,则返回结果为:14 ...

  3. Python基础——4高阶函数

    高阶函数 函数本身可用变量指向,把变量当做函数参数的函数成为高阶函数 map and reduce map()函数接收两个参数,一个是函数,一个是Iterable,map将传入的函数依次作用到序列的每 ...

  4. Python基础灬高阶函数(lambda,filter,map,reduce,zip)

    高阶函数 lambda函数 关键字lambda表示匿名函数,当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便. lambda函数省略函数名,冒号前为参数,冒号后函数体. # ...

  5. 学好Spark/Kafka必须要掌握的Scala技术点(三)高阶函数、方法、柯里化、隐式转换

    5. 高阶函数 Scala中的高阶函数包含:作为值的函数.匿名函数.闭包.柯里化等,可以把函数作为参数传递给方法或函数. 5.1 作为值的函数 定义函数时格式: val 变量名 = (输入参数类型和个 ...

  6. spark快速开发之scala基础之5高阶函数,偏函数,闭包

    高阶函数 高阶函数就是将函数作为参数或者返回值的函数. object function { def main(args: Array[String]): Unit = { println(test(f ...

  7. Scala 基础(十一):Scala 函数式编程(三)高级(一)偏函数、作为参数的函数、匿名函数、高阶函数

    1 偏函数 1)在对符合某个条件,而不是所有情况进行逻辑操作时,使用偏函数是一个不错的选择 2)将包在大括号内的一组case语句封装为函数,我们称之为偏函数,它只对会作用于指定类型的参数或指定范围值的 ...

  8. Scala集合操作中的几种高阶函数

    Scala是函数式编程,这点在集合操作中大量体现.高阶函数,也就是能够接收另外一个函数作为参数的函数. 假如现在有一个需要是将List集合中的每个元素变为原来的两倍,现在来对比Java方式实现和Sca ...

  9. python基础——高阶函数

    python基础——高阶函数 高阶函数英文叫Higher-order function.什么是高阶函数?我们以实际代码为例子,一步一步深入概念. 变量可以指向函数 以Python内置的求绝对值的函数a ...

随机推荐

  1. 【DDD】领域驱动设计实践 —— 业务建模战术

    本文结合团队在COMMUNITY(社区服务系统)业务建模过程中的实践经验,总结得到一些DDD业务建模的小招数,不一定是完美的,但是对我们团队来说很有效用,希望能帮到其他人.后面会陆续将项目中业务建模的 ...

  2. 复习下VLAN的知识

    转载:来自百度百科 VLAN一般指虚拟局域网 VLAN(Virtual Local Area Network)的中文名为"虚拟局域网". 虚拟局域网(VLAN)是一组逻辑上的设备和 ...

  3. [T-ARA][결혼 하지마][不要结婚]

    歌词来源:http://music.163.com/#/song?id=27808773 作曲 : 二段横踢 [作曲 : 二段横踢] 作词 : 二段横踢 [作词 : 二段横踢] Hey anybody ...

  4. Notes of Daily Scrum Meeting(12.16)

    最近好几门课的大作业都到了要截止的时候了,好多天队员们都抽不出来时间做软工的项目了,这样确实 和我们的计划出入很大,不过希望老师谅解,三门课程设计确实压力很大. 今天的团队任务总结如下: 团队成员 今 ...

  5. HTML5遇到的问题

    一.Uncaught SyntaxError: Unexpected identifier 解决办法: Uncaught SyntaxError: Unexpected identifier这个问题, ...

  6. ElasticSearch 2 (7) - 基本概念

    ElasticSearch 2 (7) - 基本概念 摘要 ElasticSearch的一些基本核心概念,理解这些概念有助于ElasticSearch的学习 准实时NRT(Near Realtime) ...

  7. JS基础(四)运算符

    一.比较运算符 1.== : 判断两边值是否相等 2.>= : 判断左边的值是否大于或等于右边的值 3.<= : 判断左边边的值是否小于或等于右边的值 4.>   : 判断左边的值是 ...

  8. Linux基础三(软件安装管理)

    目录: 一.Linux 中软件包的分类 1.源码包 2.二进制包 3.源码包 4.软件安装的选择 二.软件安装之 RPM 1.背景知识 2.准备知识 3.安装升级与卸载 4.查询校验与提取 三.软件安 ...

  9. Alpha 冲刺七

    团队成员 051601135 岳冠宇 051604103 陈思孝 031602629 刘意晗 031602248 郑智文 031602234 王淇 会议照片 项目燃尽图 项目进展 无进展!!!! 项目 ...

  10. Python开发【第七章】:面向对象进阶

    1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里可以通过self.调用实例变量或类 ...