目录
1,Scala基础
1.1 定义使用常量变量:
val定义常量
var定义变量
1.2 定义使用数组
方法一:
方法二:
1.3 操作数组
查看数组长度
查看数组z的第一个元素
查看数组z中除了第一个元素外的其他元素
判断数组z是否为空
判断数组z 是否包含元素“a”
1.4 连接数组
“++”连接
concat()l连接
1.5 创建区间函数,生成数组
调用函数
Scala占位符
1.6 高阶函数—函数作为返回值
定义高阶函数计算矩形周长
1.7 函数柯里化
定义两个整数相加函数的写法以及其调用方式
函数柯里化
1.8 使用for循环
For循环输出1到10
For循环嵌套if判断For循环嵌套if判断
1.9 定义不同数据类型的列表
val:name:List(类型)=List(“ ”,” ”,” ”)
使用“Nil”和“::”定义列表
1.10 定义和使用元祖
1.11 使用函数组合器
(1)Map函数可以通过一个函数重新计算列表中所有的元素
(2)Foreach()方法和map()方法类似但是无返回值
(3)Filtet()方法可以移除传入函数为false的函数
(4)flatten()方法可以将嵌套结构展开
(5)flaMap()方法结合了map()方法和flatten()方法的功能
(6)groupBy()方法可以对元素的集合进行分组操作
2.spark编程基础代码
2.1 parallelize()
创建RDD及查看分区个数
创建RDD及查看分区个数
package test
import org.apache.spark.{SparkConf, SparkContext}
object d {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("worldcount").setMaster("local")
val sc = new SparkContext(conf)
val data = Array(1, 2, 3, 4, 5)
//val distData = sc.parallelize(data)显示默认分区个数
val distData = sc.parallelize(data, 4)//设置分区为4
print(distData.partitions.size)
}
}
2.2 makeRDD()
创建RDD并查看分区值
//使用makeRDD()方法创建RDD并查看各分区的值
val seq=Seq((1,seq("iteblogs.com","sparkhost1.com")),
(3,Seq("iteblog.com","sparkhost2.com")),
(2,Seq("iteblog.com","sparkhost3.com")))
//使用makeRDD创建RDD
val iteblog=sc.makeRDD(seq)
//查看RDD的值
iteblog.collect.foreach(print)
2.3 map()方法转换数据
可以对RDD中的每一个数据元素通过某种函数进行转换并返回新的RDD
//创建RDD
val disData = sc.parallelize(List(1,3,45,3,76))
//map()方法求平均值
val sq_list=disData.map(x => x*x)
println(sq_list)
2.4 sortBy()方法进行排序
P58 获取上半年实际薪资排名前三的员工信息
//创建RDD
val data = sc.parallelize(List((1,3),(45,3),(7,6)))
//使用sortBy()方法对元祖的第二个值进行降序排序,分区个数设置为1
val sort_data=data.sortBy(x => x._2,false,1)
println(sort_data)
练习: 获取上半年实际薪资排名前三的员工信息
package test
import org.apache.spark.{SparkConf, SparkContext}
object a {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("worldcount").setMaster("local")
val sc=new SparkContext(conf)
val first_half = sc.textFile("C:\\Users\\Administrator\\Desktop\\Employee_salary_first_half.csv")
val drop_first =first_half.mapPartitionsWithIndex((ix,it) => {
if (ix==0 ) it drop(1)
it
})
val split_first = drop_first.map(line => {val data = line.split(",");
(data(1),data(6).toInt)
})
val sort_first= split_first.sortBy(x => x._2,false)
sort_first.take(3)
}
}
2.5 filter()方法进行过滤
package test
import org.apache.spark.{SparkConf, SparkContext}
object b {
def main(args: Array[String]): Unit = {
val conf =new SparkConf().setMaster("local").setAppName("PartialFumction")
val sc=new SparkContext(conf)
val rdd1 = sc.parallelize(List(('a',1),('b',2),('c',3)))
rdd1.filter(_._2>1).collect.foreach(println)
rdd1.filter(x => x._2 > 1).collect.foreach(println)
}
}
2.6 Distinct()方法去重
package test
import org.apache.spark.{SparkConf, SparkContext}
object c {
def main(args: Array[String]): Unit = {
val conf =new SparkConf().setMaster("local").setAppName("PartialFumction")
val sc=new SparkContext(conf)
val rdd3=sc.makeRDD(List(1,100,200,300,100))
rdd3.filter(x => x>99).collect()
rdd3.distinct().collect().foreach(println)
}
}
2.7 Intersection方法
package test
import org.apache.spark.{SparkConf, SparkContext}
object e {
def main(args: Array[String]): Unit = {
val conf =new SparkConf().setMaster("local").setAppName("PartialFumction")
val sc=new SparkContext(conf)
val rdd1=sc.parallelize(List(('a',1),('a',1),('b',1),('c',1)))
val rdd2=sc.parallelize(List(('a',1),('b',1),('d',1)))
//用intersection()求两个RDD的共同元素
rdd1.intersection(rdd2).collect.foreach(print)
}
}
3,sparkSQL
3.1准备工作:
spark-shell
(进到spark 创建dataframe
新建一个txt文件
hadoop fs -mkdir /spark
hadoop fs -put A.txt /spark1
将文件上传到:50070端口
到spark,导包
import spark.implicits._
3.2定义一个样例类
case class movie(movieid:Int,title:String,Genres:String)
创建RDD
val data=sc.textFile("/spark/movies.dat").map(_.split("::"))
RDD转换为DataFrame
val movies = data.map(m => movie(m(0).trim.toInt,m(1),m(2))).toDF()
用movies.show 出现的是省略过的字符
查看dataframe (p123
3.3显示所有字符
movies.show(false)
3.4查看前几条数据并且显示所有字符
3.5使用collect()获取数据
3.6 DataFrame 查询操作
3.7 实践
1.show():查看DataFrame中的具体内容信息
2.pritSchema0:查看0staFrame的Schema信息
3.select():查看DataFmame中造取部分列的数据,
下面演示查看xixiDF对象的name字段数据,具体代码如下所示
升序降序排序
查询年龄最大的前两名人的信息
Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个字段和属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。
DataFrame通过“as[ElementType]"方法转换得到Dataset