本文打算对这小段时间学习 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. pthon自动化之路-编写登录接口

    # Author:Lixiang Zoulock = "F:/Users/admin/PycharmProjects/day1/account.txt"account = &quo ...

  2. python3面向对象注意事项

    一.面向对象super的作用: class parent(object): def __init__(self): self.test() def test(self): print('parent- ...

  3. SQL邮件服务(解决各种疑难杂症)+案例 + 使用SQLserver 邮件系统发送SQL代理作业执行警告

    首先你需要知道你要做的几部: 1 每个数据库都有自己的 SERVICE BROKER 很多SQL SERVER内部服务依赖它 2 启动 SERVICE BROKER 需要 1 STOP 你的 SQL  ...

  4. 3月web前端面试小结

    说一下box-sizing的应用场景 box-sizing的属性值分为两个,border-box和content-box,其中, border-box:width=content+padding+bo ...

  5. PAT甲题题解-1126. Eulerian Path (25)-欧拉回路+并查集判断图的连通性

    题目已经告诉如何判断欧拉回路了,剩下的有一点要注意,可能图本身并不连通. 所以这里用并查集来判断图的联通性. #include <iostream> #include <cstdio ...

  6. mysql新监语句需要前面加SET FOREIGN_KEY_CHECKS=0;

    SET FOREIGN_KEY_CHECKS=0; -- ------------------------------ Table structure for guestbook-- -------- ...

  7. C++ 派生类构造函数和析构函数

    几个问题 一个类的各数据成员的构造顺序? 按他们在类定义中出现的先后顺序:先定义者先构造. 类的对象成员的构造函数与类自身的构造函数的执行顺序? 先执行对象成员的构造函数,再执行类自身的构造函数. 构 ...

  8. BlogPublishTool - 博客发布工具

    BlogPublishTool - 博客发布工具 这是一个发布博客的工具.本博客使用本工具发布. 本工具源码已上传至github:https://github.com/ChildishChange/B ...

  9. Linux内核学习总结(final)

    Linux内核学习总结 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 ...

  10. DPDK环境搭建及Helloworld样例

    配置虚拟机环境 多张网卡,一张网卡是无法运行DPDK的,至少要两张. 多核CPU,可以在实现多个DPDK逻辑调度核lcore. DPDK依赖参考:http://www.cnblogs.com/vanc ...