在idea中进行操作

//System.setProperty("hadoop.home.dir","+hadoop路径")去解决could not locate winutils.exe的问题
 //spark配置,指定任务的名称,指定资源管理器等
 val conf=new Sparkconf()
 //本地模式(方便实验,开启本地的进程执行程序)
 conf.setMaster("local")
 conf.setAppName("RDD")//设置任务名称主要使用在后台监控的,在本地所以没有任何意义//入口
 val sc=new SparkContext(conf)//数据的输入源
 /*
 从HDFS输入创建,或从与Hadoop兼容的其他存储系统中输入创建。
 从父的RDD转换的到新的RDD。
 从数据集合转换而来,通过编码实现。
 */
 //内部数据输入源,是内存中输入数据,例如:数组,列表 用于实验环境的
 val lst=List(1,2,3,4,5)
 val rdd=sc.parallelize(lst)
 /*


基于内存考虑
1.惰性求值:在进行计算的时候,转化算子是不会触发计算的,只有行动算子才会触发计算,否则不执行就是浪费在内存中
2.重新计算:一个RDD一旦计算完毕,内存资源就会被立刻释放
什么是算子?
算子可以理解为一个操作,也可以理解为RDD中的一个方法
1.transformation转换算子  从1个RDD转化到另外一个RDD,返回值是RDD就一定是转化算子
RDD中数据是只读的,不能随意修改(出于安全性,如果想要修改只能生成一个新的RDD),和元组有一点相似
2.action算子,
RDD最终的计算结果,如果返回值是其他,就是action算子

可以看以下rdd.map 和 rdd.foreach中返回值的区别,点一下ctrl+左键就可以看到返回值了
 *///外部输入源,从外部获取text文件
 //sc.textFile()val rdd1=rdd.map((x:Int) => {
     println("x="+x)
    // x*2
 })//.persist(StorageLevel.MEMORY_ONLY),先输入StorageLevel然后ctrl+左键可以看到里面的存储方式//没有任何输出的原因是因为没有触发计算
 //如果要输出的话再加上rdd1.count()
 //rdd1.count()再来一次我们会发现最终会输出两次结果,因为原本那个因为重新计算第一次的rdd1.count会被迅速释放
 //但是有的时候我们需要使用到中间的结果,假如中间转换过程很复杂,很耗时,我们有时候需要去调用,再次推导就很耗时
 //以空间换时间persist,cache
 //加上.persist之后就会只输出一次
 /*
 RDD的存储:
 用户可以选择不同的存储级别缓存RDD以便重用。
 当前RDD默认是存储于内存,但当内存不足时,RDD会溢出到磁盘中。
 MEMORY/DISK/MEMORY AND DISK/SER序列化(对数据进行压缩,牺牲CPU资源换取内存资源)和_2(备份两份)的方式
 策略:
 优先是1.memoery_only--》memory_only_ser 2.memory_and_disk 3.disk
 *///shuffle:混洗(进行大规模的数据转移)一般性看见by和bykey一定会进行shuffle
 /*
 宽窄依赖最大的区别就是是否进行shuffle
 */
 //单词统计
 val sourceRDD=sc.parallelize(List("hello world", "hello linux","linux world"))
 //第一步以空格分开单词
 //用于扩展
 sourceRDD.flatmap(
     (word:String)=>{
     val lst=word.split(" ")
         lst
     })
     .map((_,1))//生成键值对,二元组
 //没有结果的因为是map是RDD惰性若想要输出后面跟上.foreach(println(_))
 //简写形式sourceRDD.flatmap(_.split(" "))
 //"hello" "world" "hello" "linux" "linux" "world"