Spark-----RDD编程

RDD(Risilient Distributed  DataSets)  弹性分布式数据集

它是一个只读的,可分区的分布式数据集,这个数据集的全部或者部分缓存在内存中,可以多次计算和复用。

Scala语法:CSDNhttps://mp.csdn.net/mp_blog/creation/editor/120549893

一、RDD基础

(一)RDD创建方式

  加载文件

   1.从本地文件系统中加载文件

   val textfilelocal=sc.textFile("file://usr/README.md")

   

   2.从分布式文件系统hdfs中加载

   val  textfile=sc.textFile("/user/root/README.md")

  上面的sc是Spark context的一个对象

上面的textfile和textfilelocal就是RDD对象。 

官网案例:RDD Programming Guide - Spark 3.1.2 Documentation

 通过并行集合

    1.数组

 array是一个数组名字,Array是一个数组

通过sc调用parallelize方法得到的arrayRdd是一个RDD对象

    2.列表

list是一个List类的对象

listRdd是一个RDD对象

  (二)RDD操作(转化和动作)

     1.转化(Transformation):只会对RDD对象转换进行轨迹记录,不会做真正的计算,仍然会返回RDD对象

             filter(func):对RDD对象内的数据进行过滤筛选

                

foreach是对行进行循环遍历,println()  是换行输出

             map(func)

对arrayRdd里的元素分别+3   然后循环输出

             flatMap(func)

 从上面的输出结果可以看出,flatMap的作用就是根据传入参数的处理结果查分开了

splite(" ")的作用就是把

  "Hadoop is good"  转变成   字符串数组    Array("Hadoop","is","good")

"Spark is good"  转变成   字符串数组    Array("Spark ","is","good")

"Hbase is very good"  转变成   字符串数组    Array("Hbase ","is","very","good")

然后再被压扁合成一个Rdd ,每一个单词元素都是一个Rdd里的行元素

             groupByKey(func) :应用于(K,V)键值对的数据集时,返回一个新的(K,Iterable)形式的数据集。按照key进行分组,可以相同的就把相同key的值合并成一组

             reduceByKey(func):应用于(K,V)键值对的数据集时,返回一个新的(K,V)的数据集,其中的value是将key传递到函数func中进行聚合(给定义一种算法,比如把这些值相加或者其他处理)得到的结果

             combineByKey   

      2.动作(计算)

               count():返回数据集元素的个数

                collect():以数组Array形式返回数据集中的所有元素

                first():返回数据集第一个元素

                take(n):获取数据集中的前n个元素,并且以数组形式返回

                reduce(func):通过func(输入两个参数返回一个参数)来聚合数据集中的元素

                foreach(func) :将数据集中的每个元素传递到函数func中运行

惰性机制 是指  整个转换过程中只是记录了转换的轨迹,并没有发生 真正的计算,也即是只有执行  “动作”时才会计算

在/usr下    vi  README.md    添加如下内容  

 保存后把文件上传到hadoo的hdfs下   的/user/root下

如果爆出以下错误信息,需要执行设置模式的的指令 hadoop dfsadmin -safemode leave

put: Cannot create file/user/jinxing._COPYING_. Name node is in safe mode.

 这样就可以把安全模式关闭

 继续执行上传,这里要注意把防火墙都关闭,否在会提示数据节点无法访问异常提示

 

 切换到root去关闭防火墙。然后再切换回jinxing账号 执行上传

 切换目录到Spark的sbin目录下启动Spark    master和slaves   

切换换到bin目录下执行spark-shell 

完成README.md文件中的单词格式统计,里面用到了hdfs系统文件加载,

 flatMap  压扁单词,

map 映射每个单词与个数1映射

reduceByKey    进行个数的相加

collect      以数字的形式返回数据集中的所有元素

foreach   循环输出每个元素

     (三)、持久化

         可以通过“持久化(缓存)”机制来避免这种重复计算的开销,具体做法就是调用persist()方法对一个RDD标记为持久化,但是调用该方法时并不会立即计算生成RDD并把它持久化,而是调用persist()后遇到第一次计算以后,把计算结果持久化,

      持久化后的RDD将会被保留在计算机节点的内存中,被后面的行动操作重复使用。

     持久化级别:

        MEMORY_ONLY :将RDD作为反序列化的对象存储于JVM中,内存不足时按照LRU原则替换缓存内容

        MEMORY_AND_DISK:将RDD作为反序列化的对象存储于JVM中,内存不足时超出部分的分区持久化的硬盘

     

        

     (四)、分区

RDD数据存储是按分区来管理的,每一个分区包含一部分数据。分区可以在不同节点上计算。

 二、键值对RDD:使用map(fun)  可以返回键值对

         (一) 键值对RDD的创建

          (二) 常用键值对转换

三、数据读写

        (一)文件数据读写

           1.本地文件系统的读写

                    1.1 从文件中读取数据创建RDD

                     1.2 把RDD写入到文件文本

                  

            2.分布式文件系统HDFS的读写

                     2.1 从分布式系统HDFS读取文件创建RDD

                     2.2 把RDD写入HDFS系统

                        

注意这里的wordCount是一个目录

 上面的part-00000就是被保存的文件内容

因为上面进入启动spark-shell时没有指定任何参数,并且在创建RDD时没有指定分区个数,默认就是一个文件分区。

可以使用上面的方式在创建RDD时指定分区个数。 

             3.JSON文件的读取

        (二)读写HBase数据(在此之前先去HBase安装使用_金星000的博客-CSDN博客可以在/usr/hadoop/ 目录下执行wget https://dlcdn.apache.org/hbase/2.3.6/hbase-2.3.6-bin.tar.gz添加JAVA_HOME设置cd/usr/hadoop/hbase-2.3.6/confvi hbase-env.sh切换到hbase的bin目录 cd ../bin启动hbase访问浏览器http://你的主机ip:16010/...https://blog.csdn.net/jinxing_000/article/details/120452061?spm=1001.2014.3001.5501

                  编写前需要先安装和配置HBase,参考

               1.创建一个HBase表

                2.配置Spark

                3.编写程序读取HBase数据

                4.编写向HBase写入数据的程序

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值