Spark基础总结

目录

1,Scala基础

1.1  定义使用常量变量:

1.2  定义使用数组

1.3   操作数组

1.4   连接数组

1.5  创建区间函数,生成数组

​编辑1.6  高阶函数—函数作为返回值

​编辑1.7  函数柯里化

1.8  使用for循环

​编辑1.9  定义不同数据类型的列表

1.10  定义和使用元祖

1.11  使用函数组合器

2.spark编程基础代码

2.1  parallelize()

2.2  makeRDD()

2.3  map()方法转换数据

2.4  sortBy()方法进行排序

2.5  filter()方法进行过滤

2.6  Distinct()方法去重

2.7  Intersection方法

3,sparkSQL

3.1准备工作:

3.2定义一个样例类

3.3显示所有字符

3.5使用collect()获取数据

3.6 DataFrame 查询操作

3.7 实践



1,Scala基础
1.1  定义使用常量变量:

 val定义常量

7cc99aa7d5c54543a32c2f16f366c8ea.png

var定义变量

05ac0b61567a4170826a85adc6706f66.png

1.2  定义使用数组

方法一:

f10d79ade5104daba9cb595e9f909126.png

方法二:

bd8e420e67944ae3b559917f651da06b.png

1.3   操作数组

查看数组长度

查看数组z的第一个元素

查看数组z中除了第一个元素外的其他元素

判断数组z是否为空

判断数组z 是否包含元素“a”

b70ab00521444c2e8d54522c502f587b.png

1.4   连接数组

“++”连接

315f5b8ed36b47f196fc6be03ac94b8c.png

concat()l连接

43f2c2d565ba4ebfb1fdbd4ea96fa0f5.png

1.5  创建区间函数,生成数组

4d43a0816a334cf2bcbff015f6b60a43.png

调用函数

306b8c4d9f5f4f78afa2299b4018645f.pngScala占位符

6b3eb9e9a70e4e46981af1a8a9640a1b.png1.6  高阶函数—函数作为返回值

定义高阶函数计算矩形周长

dfc5777ec6af4046a7a5dd8233f17eab.png1.7  函数柯里化

定义两个整数相加函数的写法以及其调用方式

eeb6415282d942749c75866d20f61b1e.png函数柯里化

a0cd671e759948ffbd079209fbf9a39c.png

1.8  使用for循环

For循环输出1到10

362af17a65c24343b2c4535a462ffae1.pngFor循环嵌套if判断For循环嵌套if判断

340d496b62b04ee984592e376a64ce3b.png1.9  定义不同数据类型的列表

val:name:List(类型)=List(“ ”,” ”,” ”)

使用“Nil”和“::”定义列表

e6b2fbbe5ea048bc963140cda1266517.png

1.10  定义和使用元祖

ad2144c236e74b3794d4b5508b7aaf70.png

1.11  使用函数组合器

(1)Map函数可以通过一个函数重新计算列表中所有的元素

ceb4478cb8d44a99a3b3c7b11a1e9665.png

(2)Foreach()方法和map()方法类似但是无返回值

aa3870d730334bfcb1f2b7e27eefa773.png

(3)Filtet()方法可以移除传入函数为false的函数

1a872361926f40df8712c4ffde59bcd1.png

(4)flatten()方法可以将嵌套结构展开

cf978656bd5a4317b8dd4ff5da0029b7.png

(5)flaMap()方法结合了map()方法和flatten()方法的功能

59141512e03146c08e8f6a4b879fa0ed.png

(6)groupBy()方法可以对元素的集合进行分组操作

3dfc1b433d36493ab3f8aa9bb296a34d.png

2.spark编程基础代码
2.1  parallelize()

 创建RDD及查看分区个数

ae41706fc75f4339936cdffa73044b76.png

 创建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并查看分区值

7e97172765cc40879600b022893e033d.png

//使用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

73f5b2f567264925bee0c10dc79f6b84.png

//创建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()方法进行过滤

88970ea2ca0a485e9e13fa3c8c857173.png

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()方法去重

f68d1f5797894a809f7e5037c66b274f.png

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方法

c4905fecf40640deb0d47c46072c4a40.png


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._

d102a962bbea492da58655e04b3e885d.png

f28beddfc4a742788b927157fab911b2.png

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()

848efb862e44437ebedda7f665447a0d.png

用movies.show 出现的是省略过的字符

查看dataframe   (p123

3.3显示所有字符

movies.show(false)

a86017b6a17a442fba43555154c61968.png

3.4查看前几条数据并且显示所有字符

340b4e356ee94558992936532adb3a86.png

539d77bface245b19f34a1eb42811f35.png

7a44845f1d8647be81c63fd5c3015799.png

3.5使用collect()获取数据

79e5e3a758704f549ebf18ef3909f0eb.png

3.6 DataFrame 查询操作

554ec86e7be14213a1e2b8d386a4f928.png

77c6298cdb32465c9d10b1bea76f1b3e.png

3.7 实践

7e6520b1b20f48dca4e5c443fa154e64.png

7849ede7e1e543a8b4c0d68d3b15e13a.png

1.show():查看DataFrame中的具体内容信息

2.pritSchema0:查看0staFrame的Schema信息

3.select():查看DataFmame中造取部分列的数据,

下面演示查看xixiDF对象的name字段数据,具体代码如下所示

fa231fcc87f34ac8bac784fd0b142125.png

232d4bb454804fa5a77996e612587ea2.png

•要求过滤age 大于44等于44的数据

2c0b88af97ed4a3d82037f99171d11ae.png

升序降序排序

04f0364f20a7409e955bd9a2c75ad834.png

查询年龄最大的前两名人的信息

d8546900870b4aa58b26e14f2b961741.png

 Dataset数据的表现形式,序号(3)和(4),其中序号(3)是在RDD每行数据的基础之上,添加一个数据类型(value:String)作为Schema元数据信息。而序号(4)每行数据添加People强数据类型,在Dataset[Person]中里存放了3个字段和属性,Dataset每行数据类型可自定义,一旦定义后,就具有错误检查机制。

71bf91987c184d3790ce39a51bfdc297.png

 DataFrame通过“as[ElementType]"方法转换得到Dataset

b3b84d523e924e9faec3f32a5153eed5.png

  • 25
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值