本文打算对这小段时间学习 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. android studio 下载 sdk 失败

    android studio 打开项目出现以下错误时,点击去安装,会提示"All packages are not available for download" 错误. 解决办法 ...

  2. Meteor入门介绍

    Meteor是什么 基于nodejs的实时web APP开发框架. Meteor能带来什么 简单的说,你可以用js搞定客户端.服务端的开发.另外,客户端.服务端的界限被极大的模糊.客户端的界面跟服务端 ...

  3. 使用pyspark模仿sqoop从oracle导数据到hive的主要功能(自动建表,分区导入,增量,解决数据换行符问题)

    最近公司开始做大数据项目,让我使用sqoop(1.6.4版本)导数据进行数据分析计算,然而当我们将所有的工作流都放到azkaban上时整个流程跑完需要花费13分钟,而其中导数据(增量)就占了4分钟左右 ...

  4. leetcode刷题笔记258 各位相加

    题目描述: 给一个非负整数 num,反复添加所有的数字,直到结果只有一个数字. 例如: 设定 num = 38,过程就像: 3 + 8 = 11, 1 + 1 = 2. 由于 2 只有1个数字,所以返 ...

  5. App推荐 | Google Tasks

    前不久,Google推出了一款移动任务管理应用Google Task,在使用2天后,写一下使用感受,并与Google同类产品Keep进行一个对比. 首先欣赏几张官方的App截图 然后来看一下官方的介绍 ...

  6. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  7. java实验报告五

    一.实验内容 1.掌握Socket程序的编写: 2.掌握密码技术的使用: 3.设计安全传输系统. 二.实验基础: IP和端口:IP是用来标示计算机,而端口是用来标示某个计算机上面的特定应用.至于它们的 ...

  8. 云平台项目--学习经验--回调函数中call和apply

    Js中可以通过call和apply来代替另一个对象调用一个方法,将一个函数对象上下文从初始上下文改变为thisObj指定的新对象.简而言之,改变函数执行的上下文,而call和apply的基本区别在于他 ...

  9. 【Leetcode】222. Count Complete Tree Nodes

    Question: Given a complete binary tree, count the number of nodes. Definition of a complete binary t ...

  10. ThreadLocal 与 Synchronized区别

    相同:ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题.不同:Synchronized同步机制采用了“以时间换空间”的方式,仅提供一份变量,让不同的线程排队访问:而Thr ...