Spark程序设计—创建RDD:从Scala集合构造成RDD

parallelize(a, 3)

makeRDD(a, 3)

他俩使用方式一样,只不过名字不一样

Spark程序设计—创建RDD:本地文件/HDFS

textFile(path, 100)

sequenceFile

wholeTextFiles

举例:

1. 文本文件(TextInputFormat)

  sc.textFile(“file.txt”) //将本地文本文件加载成RDD

  sc.textFile(“directory/*.txt”) //将某类文本文件加载成RDD

  sc.textFile(“/data/input”)

  sc.textFile(“file:///data/input”)

  sc.textFile(“hdfs:///data/input”)

  sc.textFile(“hdfs://namenode:8020/data/input”)

2. sequenceFile文件(SequenceFileInputFormat)(SequenceFile文件是Hadoop用来存储二进制形式的key-value对而设计的一种平面文件(Flat File))

  sc.sequenceFile(“file.txt”) //将本地二进制文件加载成RDD

  sc.sequenceFile[String, Int] (“hdfs://nn:9000/path/file”)

3. 使用任意自定义的Hadoop InputFormat

  sc.hadoopFile(path, inputFmt, keyClass, valClass)

Spark程序设计—控制ReduceTask数目

所有key/value RDD操作符均包含一个可选参数,表示reduce task并行度

  words.reduceByKey(_ + _, 5)

  words.groupByKey(5)

  visits.join(pageViews, 5)

用户也可以通过修改spark.default.parallelism设置默认并行度

默认并行度为最初的RDD partition数目

Spark高级程序设计——accumulator

Accumulator累加器,分布式累加器

  类似于MapReduce中的counter,将数据从一个节点发送到其他各个节点上去

  通常用于监控,调试,记录符合某类特征的数据数目等

import SparkContext._
val total_counter = sc.accumulator(0L, "total_counter")
val counter0 = sc.accumulator(0L, "counter0") //定义两个累加器
val counter1 = sc.accumulator(0L, "counter1")
val count = sc.parallelize( to n, slices).map { i =>
total_counter +=
val x = random * -
val y = random * –
if (x*x + y*y < ) {
counter1 += //累加器counter1加1
} else {
counter0 += //累加器counter0加1
}
if (x*x + y*y < ) else
}.reduce(_ + _)//

Spark高级程序设计—广播变量broadcast

广播机制

  高效分发大对象,比如字典(map),集合(set)等,每个executor一份,而不是每个task一份

  包括HttpBroadcast和TorrentBroadcast两种

val data = Set(, , , , …..) // 大小为128MB
val bdata = sc.broadcast(data)//将大小为128MB的Set广播出去
val rdd = sc.parallelize(1to , )
val observedSizes= rdd.map(_ => bdata.value.size ….)//在各个task中,通过bdata.value获取广播的集合

Spark高级程序设计—cache

val data = sc.textFile("hdfs://nn:8020/input")
data.cache()
//data.persist(StorageLevel.DISK_ONLY_2)

1、如何创建一个分区为2的RDD:

  创建一个RDD,分区为2,即对list进行并行化,并行度为2

scala> val rdd = sc.parallelize(List(,,),)
rdd: org.apache.spark.rdd.RDD[Int] = ParallelCollectionRDD[] at parallelize at <console>:

  或者启动10个map Task进行处理,对10个分区都进行map处理

val slices =
val n = * slices
val count = sc.parallelize( to n, slices).map { i =>
val x = random * -
val y = random * -
if (x*x + y*y < ) else
}.reduce(_ + _)

2、将一个有两个分区的RDD收集起来

scala> rdd.collect
res3: Array[Int] = Array(, , )

3、得到这个rdd的分区数

scala> rdd.partitions.size
res4: Int =

4、想要看每个分区结果

  用glom,glom是将一个RDD的每一个分区都变成Array

scala> rdd.glom.collect
res5: Array[Array[Int]] = Array(Array(), Array(, ))

5、将rdd写入hdfs

scala> rdd.saveAsTextFile(“hdfs://nn:8020/output”)
或者
scala> rdd.saveAsSequenceFile(“hdfs://nn:8020/output”) saveastextfile,写的是一个目录,目录下面会生成文件,不要直接指定文件名称 如果rdd会有多个分区,则生成多个文件

6、将多个RDD合并为一个RDD

rdd1.union(rdd2)
或者
rdd2++rdd1
或者
sc.union(rdd1,rdd2,rdd3)
最终的分区数是他们分区数的和

7、产生10w个文件,每个文件里有100个整数

sc.parallelize( to   , ).map(x = > scala.uril.Random.nextLong).saveTextFile("file:///tmp/)

8、将数据放到内存,再从内存中清除掉

rdd.cache()   //需要action才触发cache()
//1w行数据,如果用take(1)来触发action,那么只会cache 一行数据,而不会吧1w行数据都放内存
//从内存中清除
rdd.unpersist(true) //true的意思是,是否一直卡着,知道清空在往下运行

9、在集群上提交程序的时候报错:classNotFound,说明类不在jar包里,去从jar中查找

jar tf xxx.jar |grep 文件名或者类名

10、用命令kill掉运行在Hadoop之上的spark程序

yarn application -kill id

11、x(0), (x(1), x(2))与x._2._2的区别

//数据集如下
//users.dat
// UserID::Gender::Age::Occupation::Zip-code
//movies.dat
// MovieID::Title::Genres
//ratings.dat
// UserID::MovieID::Rating::Timestamp //加载数据
val usersRdd = sc.textFile(“users.dat”)
val ratingsRdd = sc.textFile(“ratings.dat”) //数据抽取
//users: RDD[(userID, (gender, age))]
val users = usersRdd.map(_.split("::")).map { x =>
(x(), (x(), x()))
} //rating: RDD[Array(userID, movieID, ratings, timestamp)]
val rating = ratingsRdd.map(_.split("::")) //usermovie: RDD[(userID, movieID)]
val usermovie = rating.map{ x =>
(x(), x())
}.filter(_._2.equals(MOVIE_ID)) //useRating: RDD[(userID, (movieID, (gender, age))]
val userRating = usermovie.join(users)
//movieuser: RDD[(movieID, (movieTile, (gender, age))]
val userDistribution = userRating.map { x =>
(x._2._2, )
}.reduceByKey(_ + _)
userDistribution.foreach(println) //总结:如果是Array,那么x(0),x(1)代表的是数组中的第0个,第1个元素
//如果是元组(a,b)这种,那么x._1代表的就是a

12、reduceByKey除了_+_,再举例

//.reduceByKey是对相同key做reduce操作,reduce操作除了_+_还有很多其他用法,如下
dataSet.map(line => (extractKey(line), extractStats(line)))
.reduceByKey((a, b) => a.merge(b))
.collect().foreach()

13、groupByKey返回的是什么?

(String,Iterator),value:迭代器里放的是,同一个key对应的一些值的一个集合,如果要求Iterator的数量,count不可以的话,试试size

14、reduceByKey返回的是什么?

//返回的是 RDD
//如果是 WordCount 这种的
//返回的就是 RDD[(String, Int)]

15、groupByKey可以接收函数吗?如何达到reduceByKey一样的结果?

//不可以
//如下
val words = Array("one", "two", "two", "three", "three", "three") val rdd = sc.parallelize(words).map(word => (word, )) val a = rdd.reduceByKey(_ + _) val b = rdd.groupByKey().map(t => (t._1, t._2.sum)) a和b结果一样

16、sortBy怎么用,如何对key-value 的value 降序排序

//拿 WordCount 举例
map((_, 1))
.reduceByKey(_+_)
.sortBy(_._2,false)

17、sortByKey怎么用

rdd,map(x => (x(1),x(2))).sortByKey(false) //降序

spark程序设计的更多相关文章

  1. 【Spark深入学习 -12】Spark程序设计与企业级应用案例02

    ----本节内容------- 1.遗留问题答疑 1.1 典型问题解答 1.2 知识点回顾 2.Spark编程基础 2.1 Spark开发四部曲 2.2 RDD典型实例 2.3 非RDD典型实例 3. ...

  2. 利用Scala语言开发Spark应用程序

    Spark内核是由Scala语言开发的,因此使用Scala语言开发Spark应用程序是自然而然的事情.如果你对Scala语言还不太熟悉,可 以阅读网络教程A Scala Tutorial for Ja ...

  3. Spark学习资料共享

    链接相关 课件代码:http://pan.baidu.com/s/1nvbkRSt 教学视频:http://pan.baidu.com/s/1c12XsIG 这是最近买的付费教程,对资料感兴趣的可以在 ...

  4. Spark2.x学习笔记:Spark SQL程序设计

    1.RDD的局限性 RDD仅表示数据集,RDD没有元数据,也就是说没有字段语义定义. RDD需要用户自己优化程序,对程序员要求较高. 从不同数据源读取数据相对困难. 合并多个数据源中的数据也较困难. ...

  5. 《Spark MLlib机器学习实践》内容简介、目录

      http://product.dangdang.com/23829918.html Spark作为新兴的.应用范围最为广泛的大数据处理开源框架引起了广泛的关注,它吸引了大量程序设计和开发人员进行相 ...

  6. 《深入理解Spark:核心思想与源码分析》(前言及第1章)

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  7. 《深入理解Spark:核心思想与源码分析》一书正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  8. 《深入理解Spark:核心思想与源码分析》正式出版上市

    自己牺牲了7个月的周末和下班空闲时间,通过研究Spark源码和原理,总结整理的<深入理解Spark:核心思想与源码分析>一书现在已经正式出版上市,目前亚马逊.京东.当当.天猫等网站均有销售 ...

  9. 十位一线专家分享Spark现状与未来----峰会摘录

    CSDN大数据技术: 十位一线专家分享Spark现状与未来(一) 十位一线专家分享Spark现状与未来(二) 十位一线专家分享Spark现状与未来(三) 部分摘录: 加州大学伯克利分校AMP实验室博士 ...

随机推荐

  1. 复习及总结--.Net线程篇(3)

    不幸的发现,原来多线程的东西还有好多. 不只是一个Thread就能把事情做完的,好吧,孤陋寡闻了 这里总结下  复习及总结--.Net线程篇(2)里的两个概念AppDomain和ThreadPool ...

  2. 微软笔试题-highways

    题目大意 一条单向的高速公路上有N辆车,在0时刻,每辆车分别在起点A[0],A[1]....处开始从北向南出发,每辆车有个终点B[0],B[1]....且每辆车有个限制速度 V[0],V[1]... ...

  3. coderfun-boot接私活利器,文档详实,非一般的开发速度

    项目主页:https://gitee.com/klguang/coderfun-boot 演示地址:http://106.15.195.9:8080/admin/项目文档:https://www.ka ...

  4. Hadoop 启动脚本分析与实战经验

    start-all.sh脚本现在已经废弃,推荐使用start-dfs.sh和start-yarn.sh分别启动HDFS和YARN. 在新一代的Hadoop里面HDFS称为了统一存储的平台,而YARN成 ...

  5. Python 常用资源

    Python:https://www.python.org/ftp/python/ Django:https://www.djangoproject.com/download/

  6. Redis集群部署文档(Ubuntu15.10系统)

    Redis集群部署文档(Ubuntu15.10系统)(要让集群正常工作至少需要3个主节点,在这里我们要创建6个redis节点,其中三个为主节点,三个为从节点,对应的redis节点的ip和端口对应关系如 ...

  7. lowB三人组算法-冒泡排序-选择排序-插入排序

    冒泡排序 时间复杂度:O(n2)  算法稳定 第一趟,从第一个数开始,相邻两个数比较,大的数交换放后,交换到最后位置得出一个第一大数 第二趟,从第一个数开始,相邻两个数比较,大的数交换放后,交换到倒数 ...

  8. 3.2 - FTP文件上传下载

    题目:开发一个支持多用户同时在线的FTP程序要求:1.用户加密认证2.允许同时多用户登录3.每个用户有自己的家目录,且只能访问自己的家目录4.对用户进行磁盘配额,每个用户的可用空间不同5.允许用户在f ...

  9. 基于stm32CubeMX和keil5的stm32f103学习编程

    0.       准备 先用st-link连接stm32核心板与PC,用于烧录 St-link Stm32 3.3V 3.3V GND GND SWDIO DIO SWCLK DCLK 再用USB串口 ...

  10. C# 中利用 Conditional 定义条件方法

    利用 Conditional 属性,程序员可以定义条件方法.Conditional 属性通过测试条件编译符号来确定适用的条件.当运行到一个条件方法调用时,是否执行该调用,要根据出现该调用时是否已定义了 ...