本文打算对这小段时间学习 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. 软件测试_测试工具_LoadRunner

    最近正在逐步学习软件测试工具的使用,此文章也是用来当做笔记以供记录之用.如有问题,还请多多指出. 安装LoadRunner基本步骤从网上搜索即可找到,特此提供部分链接参考(其中附带软件下载): 1.L ...

  2. [翻译]:Cinemachine 官方文档(0)

    目录 Overview : Installation and Getting Started :安装并开始 User Guide :用户指南 What is Cinemachine? : 什么是Cin ...

  3. B1030 完美数列 (25 分)

    这是一道二分法的题目,许久不使用二分法,感觉有点生疏. #include<bits/stdc++.h> using namespace std; const int MAXN=100000 ...

  4. win10系统安装web3js的正确方法

    在安装web3的时候 用npm  install web3 –save-dev 在win10系统下会一直安装不成功.后来换用了 cnpm install web3 –save-dev 安装时候报出:C ...

  5. 一张图理解Git

    更详细的git介绍:Git操作指南

  6. LeetCode 463. Island Perimeter岛屿的周长 (C++)

    题目: You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 repr ...

  7. PPT 遥控器

    1. 下载 最新版本: 百度袋鼠输入: http://daishu.baidu.com/?from=pptweb 百度PPT遥控器:http://ppt.baidu.com/ 2. 安装过程忽略 3. ...

  8. API接口重复提交

    重复提交的几种情况1.利用JavaScript防止表单重复提交 按钮禁用2.利用Session令牌防止表单重复提交 具体的做法:在服务器端生成一个唯一的随机标识号,专业术语称为Token(令牌),同时 ...

  9. 小程序开发 event对象中 target和currentTarget 属性的区别。

    首先本质区别是: event.target返回触发事件的元素 event.currentTarget返回绑定事件的元素 p包含在div内 在outer上点击时,target跟currentTarget ...

  10. OneZero第三次站立会议(2016.3.23)

    会议时间:2016年3月23日 13:00~13:15 会议成员:冉华,张敏,王巍,夏一鸣. 会议目的:汇报前一天工作,全体成员评论并修改. 会议内容:以下为会议插图 1.界面原型方面,夏在统计界面中 ...