本文打算对这小段时间学习 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. 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context}Setting property 'source' to 'org.eclipse

    当你用Eclipse运行web项目的时候,你就会看到控制台出现:WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Set ...

  2. 树莓派3b安装Nginx和php7和百度语音合成模块

    1.安装sox系统mp3音频播放模块(项目需要) sudo apt-get install lame sudo apt-get install sox sudo apt-get install lib ...

  3. 基于神念TGAM的脑波小车(1)

    作者声明:此博客是作者的毕设心得,拿来分享. 拿到模块,在网上查了一圈,发现基本没什么有用的资料,有也是一些废话,经过我几个月的攻克,现在已初步搞定,分享给大家. 废话不多说,直接步入正题. 这是通过 ...

  4. 【SE】Week1 : 个人博客作业

    快速看完整部教材,列出你不懂的 5 - 10 个问题,发布在你的个人博客上. 1)针对书中提到的NABCD模型中的N,如何发掘市场不明确的潜在用户需求? 2)PM是否负责团队职责的分配以及工程模块的设 ...

  5. 2-Eighteenth Scrum Meeting-20151218

    任务安排 成员 今日完成 明日任务 闫昊 写完学习进度记录的数据库操作  写完学习进度记录的数据库操作 唐彬 编写与服务器交互的代码 和服务器老师交流讨论区后台接口 史烨轩 获取视频url  尝试使用 ...

  6. 第二个Sprint冲刺第六天

    第二个Sprint冲刺第六天

  7. WPF和js交互 调用窗体中的方法

    public partial class WebTest: Window { private void Window_ContentRendered(object sender, EventArgs ...

  8. 基于Air800+Arduino+ESP8266的混合物联网开发

    流程图如下:

  9. 实战基于Spring Boot 2的WebFlux和mLab搭建反应式Web

    Spring Framework 5带来了新的Reactive Stack非阻塞式Web框架:Spring WebFlux.作为与Spring MVC并行使用的Web框架,Spring WebFlux ...

  10. Delphi中如何实现模拟组合按键,如发送Ctrl+F的按键

    利用 keybd_event函数可实现,如下面的代码用以实现在一个公共菜单中模拟Ctrl_F按钮以调用DBGridEH的查找对话框功能:这是在一个ActionList中的某一Action的OnExec ...