• Spark学习 -- RDD


    一、RDD是什么

      RDD,全称为 Resilient Distributed Datasets,是一个容错的、并行数据结构,可以让用户显式地将数据存储到磁盘内存中,并能控制数据的分区。

      RDD是只读的、分区记录的集合。RDD只能基于在稳定物理存储中的数据集和其他已有的RDD上执行确定性操作来创建。这些确定性操作称之为转换,如map、filter、groupBy、join(转换不是程开发人员在RDD上执行的操作)

      RDD 还提供了诸如 join、groupBy、reduceByKey 等更为方便的操作(注意,reduceByKey 是 action,而非 transformation),以支持常见的数据运算。

    二、RDD性质

      一个RDD是一个不可变化的分布式集合对象

      Spark中所有的计算都是通过RDDs的创建、转换、操作完成的

      一个RDD内部有许多的partitions(分片)组成的

    三、partitions(分片)

      每个分片包括一部分数据,partitions可在集群不同节点上计算

      分片是Spark并行处理的单元,Spark顺序的,并行的处理分片

    四、RDD的创建方法

       1、把一个存在的集合传给SparkContext的parallelize()方法,一般是在测试的时候用

    val rdd = sc.parallelize(Array(1,2,4,5),4)
    

        参数 1: 待并行处理的数据集合;   参数 2: 分区个数。 代码如下:

       2、加载外部数据集

        val rddText = sc.textFile(文件路径)

    五、Transformation(转换)

      从之前的RDD构建一个新的RDD,像map() 和 filter()

      1、逐元素Transformation

        map()

          map()接收函数,把函数应用到RDD的每一个元素,返回新的RDD

    scala> val lines = sc.parallelize(Array("hello","spark","hello","world","!"))
    lines: org.apache.spark.rdd.RDD[String] = ParallelCollectionRDD[11] at parallelize at <console>:24
    
    scala> lines.foreach(print)
    helloworld!sparkhello
    scala> lines.foreach(println)
    hello
    hello
    !
    world
    spark
    
    scala> val lines2 = lines.map(word => (word, 1))
    lines2: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[12] at map at <console>:25
    
    scala> lines2.foreach(println)
    (hello,1)
    (world,1)
    (hello,1)
    (!,1)
    (spark,1)

       

        filter():

          filter()接收函数,返回只包含满足filter()函数的元素的新RDD

    scala> val lines3 = lines.filter(word => word.contains("hello"))
    lines3: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[13] at filter at <console>:25
    
    scala> lines3.foreach(println)
    hello
    hello

       

        * flatMap():

          对每个输入元素,输出多个输出元素

          flat压扁的意思,将RDD中元素压扁之后返回一个新的RDD

    scala> val inputs = sc.textFile("/Users/hunter/LYH/word.text")
    
    scala> val lines = inputs.flatMap(line=>line.split(" "))
    lines: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[16] at flatMap at <console>:25
    
    scala> lines.foreach(println)
    

      

  • 相关阅读:
    SynchronousQueue、LinkedBlockingQueue、ArrayBlockingQueue性能测试
    JDK源码分析—— ArrayBlockingQueue 和 LinkedBlockingQueue
    ArrayBlockingQueue和LinkedBlockingQueue的区别
    Net处理html页面元素工具类(HtmlAgilityPack.dll)的使用
    WebView混合开发
    对付"反盗链"
    通过代码来操作SQLite的示例
    System.Data.SQLite未能加载文件或程序集
    Using SQLXML Bulk Load in the .NET Environment
    Asynchronous Programming Using Delegates使用委托进行异步编程
  • 原文地址:https://www.cnblogs.com/Lyh1997/p/11171111.html
Copyright © 2020-2023  润新知