一、SPARK-CORE

  1.spark核心模块是整个项目的基础。提供了分布式的任务分发,调度以及基本的IO功能,Spark使用基础的数据结构,叫做RDD(弹性分布式数据集),是一个逻辑的数据分区的集合,可以跨机器。RDD可以通过两种方式进行创建,一种是从外部的数据集引用数据,第二种方式是通过在现有的RDD上做数据转换。RDD抽象是通过语言集成的API来进行暴露,它简化了编程的复杂度,因为这种操纵RDD的方式类似于操纵本地数据集合

二、RDD变换(API阅读)

**
* A Resilient Distributed Dataset (RDD), the basic abstraction in Spark. Represents an immutable,
* partitioned collection of elements that can be operated on in parallel. This class contains the
* basic operations available on all RDDs, such as `map`, `filter`, and `persist`. In addition,
* [[org.apache.spark.rdd.PairRDDFunctions]] contains operations available only on RDDs of key-value
* pairs, such as `groupByKey` and `join`;
* [[org.apache.spark.rdd.DoubleRDDFunctions]] contains operations available only on RDDs of
* Doubles; and
* [[org.apache.spark.rdd.SequenceFileRDDFunctions]] contains operations available on RDDs that
* can be saved as SequenceFiles.
* All operations are automatically available on any RDD of the right type (e.g. RDD[(Int, Int)]
* through implicit.
*
* Internally, each RDD is characterized by five main properties:
*
* - A list of partitions
* - A function for computing each split
* - A list of dependencies on other RDDs
* - Optionally, a Partitioner for key-value RDDs (e.g. to say that the RDD is hash-partitioned)
* - Optionally, a list of preferred locations to compute each split on (e.g. block locations for
* an HDFS file)
*
* All of the scheduling and execution in Spark is done based on these methods, allowing each RDD
* to implement its own way of computing itself. Indeed, users can implement custom RDDs (e.g. for
* reading data from a new storage system) by overriding these functions. Please refer to the
* <a href="http://people.csail.mit.edu/matei/papers/2012/nsdi_spark.pdf">Spark paper</a>
* for more details on RDD internals.
*/

  1.RDD变换返回一个指向新RDD的指针并且允许你在RDD之间创建依赖,在依赖链条中的每个RDD都有一个计算数据的函数以及一个指向父RDD的指针。Spark是懒惰的,所以除非你调用一些除法任务创建以及执行的转换或者Action,否则什么都不干。

因此RDD变换不是一个数据集,而是在一个程序中的一个步骤,用来告诉如何获取数据以及怎么进行数据的相关的处理。

  2.下面给出的是一个RDD变换列表

    (0)接下来的试验都是以test.txt这个文件为试验对象的,其中test.txt中的内容为如下情况:

hello world1,
hello world2,
hello world3,
hello world4

    (1)map(func):返回一个新的RDD(弹性分布式数据集),通过对这个RDD的每个元素素应用func函数形成一个新的RDD。

    (2)flatMap(func):与map函数相似,但是每个输入项可以被映射为0个或者多个输出项(所以func函数应该返回一个Seq而不是一个单独的数据项)。通过对这个RDD的所有元素应用一个函数来返回一个新的RDD,然后将这个结果进行扁平化处理。

import org.apache.spark.{SparkConf, SparkContext}

object WordCountMapDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("WordCountMapDemo")
val sc = new SparkContext(conf)
val rdd1 = sc.textFile("E:/scala/test.txt")
val rdd2 = rdd1.flatMap(_.split(" "))
val rdd3 = rdd2.map((_,))
val rdd4 = rdd3.reduceByKey(_ + _);
val rdd5 =rdd4.collect()
rdd5.foreach(println)
}
}

  (3)使用filter过滤器。返回通过选择函数返回true的源元素形成的新数据集。

package com.jd.www.wordCount

import org.apache.spark.{SparkConf, SparkContext}

object WordCountFilterDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("WordCountFilterDemo").setMaster("local");
val sc = new SparkContext(conf)
val rdd1 = sc.textFile("E:/scala/test.txt")
val rdd2 = rdd1.flatMap(_.split(" "))
//过滤器
val rdd3 = rdd2.filter(_.startsWith("wor"))
val rdd4 = rdd3.map((_, ))
val rdd5 = rdd4.reduceByKey(_ + _)
val rdd6 = rdd5.collect()
rdd6.foreach(println)
}
}

  (4)mapPartitions:通过将函数应用于此RDD的每个分区来返回新的RDD。与map类似,但在RDD的每个分区(块)上单独运行,因此当在类型T的RDD上运行时,func必须是Iterator <T> => Iterator <U>类型。 

package com.jd.www.wordCount

import org.apache.spark.{SparkConf, SparkContext}

object WordCountMapPartitionsDemo {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("WordCountFlatMapDemo")
val sc = new SparkContext(conf);
val rdd1 = sc.textFile("E:/scala/test.txt")
val rdd2 = rdd1.flatMap(_.split(" "));
val rdd3 = rdd2.mapPartitions(it=> {
import scala.collection.mutable.ArrayBuffer
val buf = new ArrayBuffer[String]()
for (e <- it) {
buf.+=("_" + e)
}
buf.iterator
}
)
val rdd4 = rdd3.map((_, ))
val rdd5 = rdd4.reduceByKey(_ + _)
val rdd6 = rdd5.collect()
rdd6.foreach(println)
} }

  (5)mapPartitionsWithIndex:通过对这个RDD的每个分区应用一个函数,然后返回一个新的RDD,同时对索引进行跟踪

import org.apache.spark.{SparkConf, SparkContext}

object WordCountMapPartitionsWithIndex {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setAppName("WordCountMapPartitionsWithIndex").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd1 = sc.textFile("e:/scala/test.txt",)//定义最小分区数
val rdd2 = rdd1.flatMap(_.split(" "))
val rdd3 = rdd2.mapPartitionsWithIndex((index,it)=>{
import scala.collection.mutable.ArrayBuffer
val tName = Thread.currentThread().getName
println(tName+":"+index+""+":mappartitions start")
val buf = new ArrayBuffer[String]()
for(e<-it){
buf.+=("_"+e)
}
buf.iterator
})
val rdd4 = rdd3.map((_,))
val rdd5 = rdd4.reduceByKey(_ + _)
rdd5.foreach(println)
} }

  (6)sample(withReplacementfractionseed):使用给定的随机数生成器种子,在有或没有替换的情况下对数据的一小部分进行采样。

    

    

   

    

    

spark浅谈(2):SPARK核心编程的更多相关文章

  1. 浅谈Apache Spark的6个发光点(CSDN)

    Spark是一个基于内存计算的开源集群计算系统,目的是更快速的进行数据分析.Spark由加州伯克利大学AMP实验室Matei为主的小团队使用Scala开发开发,其核心部分的代码只有63个Scala文件 ...

  2. spark浅谈(1):RDD

    一.弹性分布式数据集 1.弹性分布式数据集(RDD)是spark数据结构的基础.它是一个不可变的分布式对象的集合,RDD中的每个数据集都被划分为一个个逻辑分区,每个分区可以在集群上的不同节点上进行计算 ...

  3. spark浅谈(3):

    一.shuffle操作 1.spark中特定的操作会触发我们都知道的shuffle事件,shuffle是spark进行数据重新分布的机制,这通常涉及跨执行程序和机器来赋值数据,使得混洗称为复杂而且昂贵 ...

  4. 浅谈TCP/IP网络编程中socket的行为

    我认为,想要熟练掌握Linux下的TCP/IP网络编程,至少有三个层面的知识需要熟悉: 1. TCP/IP协议(如连接的建立和终止.重传和确认.滑动窗口和拥塞控制等等) 2. Socket I/O系统 ...

  5. 浅谈C#关于AOP编程的学习总结

    难得在这样一个节日里给写出一篇博客,却没有佳人相约,没办法,这就是一个程(dan)序(shen)猿(gou)的真实生活情景,每天除了coding还是coding.唉..污染各位看官的眼了.好吧,进入正 ...

  6. 新手浅谈C#Task异步编程

    Task是微软在.net framework 4.0发布的新的异步编程的利器,当然4.5新增了async.await,这儿我们先说Task相关. 在实际编程中,我们用的较多的是Task.Task.Fa ...

  7. 浅谈Python中函数式编程、面向对象编程以及古怪的PythonIC

    1.函数式编程作为结构化编程的一种,正在受到越来越多的重视.那么什么事函数式编程呢? 在维基百科中给出了详细的定义,函数式编程又称泛函数编程,是一种编程规范,它将函数运算视为数学上的函数计算.简单的来 ...

  8. 浅谈SOA面向服务化编程架构(dubbo)

      dubbo 是阿里系的技术.并非淘宝系的技术啦,淘宝系的分布式服务治理框架式HSF啦 ,只闻其声,不能见其物.而dubbo是阿里开源的一个SOA服务治理解决方案,dubbo本身 集成了监控中心,注 ...

  9. 01 浅谈c++及面向对象编程

    参考链接: 学习完c++但是对c++面向对象编程还是比较模糊,现在花时间总体来总结一下: c++中的对象是使用类来定义的,下面先重点讲一下类的概念. 说到类就要先说一下类的三种特性:封装,继承,多态. ...

随机推荐

  1. springboot自定义异常视图

    一.源码分析 先看源码再写自己的自定义异常视图         resolveErrorView()函数首先调用了一个返回ModelAndView的函数,该函数所需的参数是一个状态码的字符串,和一个m ...

  2. 洛谷P1310 表达式的值——题解

    题目传送 题的难点:1.有运算优先级,不好判断.2.有破坏整体和谐性的讨厌的括号.3.不知道哪里要填数.4.要求方案数很大,搜索不会做呐. 发现难点1和2都是中缀表达式的缺点.转成后缀表达式后难点1. ...

  3. Oracle传输数据到Sqlserver

    通过Sqlserver的SSIS工具实现数据传输

  4. python-之基本语法

    模块一些函数和类的集合文件,并实现一定的功能,当我们需要使用这些功能的时候,可以直接把相应的模块导入到我们的程序中 import import mode    #导入mode模块 即导入mode模块后 ...

  5. vsphere client 虚拟机随主机自动启动

  6. Visual Studio使用技巧 +谷歌浏览器使用技巧总结

    一.总结下visual studio常用的使用技巧,有助于提高效率: 1.给代码行打标记:  ctrl + K :给行打标记:ctrl + K + N:切换标记,即使当前页关闭了,也可以适用此快捷键快 ...

  7. leetcode-mid-Linked list- 105. Construct Binary Tree from Preorder and Inorder Traversal

    mycode   43.86% # Definition for a binary tree node. # class TreeNode(object): # def __init__(self, ...

  8. 10.1 ‘The server's host key is not cached in the registry’

    10.1 ‘The server's host key is not cached in the registry’ This error message occurs when PuTTY conn ...

  9. 如何查看yum安装的程序包都放在哪些地方了?

    yum安装, 是先下载下来, 然后安装, 用dnf代替yum后, 配置文件跟yum类似, 也是放在 /etc/dnf/ 目录下的, 也有dnf.conf 配置文件等 dnf list后面还可以跟参数: ...

  10. 用Vue来实现音乐播放器(九):歌单数据接口分析

    z这里如果我们和之前获取轮播图的数据一样来获取表单的数据  发现根本获取不到 原因是qq音乐在请求头里面加了authority和refer等 但是如果我们通过jsonp实现跨域来请求数据的话  是根本 ...