Spark笔记

来源:互联网 发布:数据库编程题 编辑:程序博客网 时间:2024/06/06 00:54
  1. spark程序的工作流程
    • 从外部数据创建出输入RDD
    • 使用诸如filter()这样的转化操作对RDD进行转化,已定义新的RDD
    • 告诉Spark对需要被重用的中间结果RDD执行peisist()操作
    • 使用行动操作(例如count()和first()等)来触发一次并行操作,Spark会对计算进行优化后再执行
  2. 向spark传递函数

    • 传递的函数及其引用的数据需要时可序列化的(实现了java的Serializable接口)。如果在Scala 中出现了NotSerializableException,通常问题就在于我们传递了一个不可序列化的类中的函数或字段。
    • 把需要的字段放到一个局部变量中,来避免传递包含该字段的整个对象

      class SearchFunctions(val query: String) {    def isMatch(s: String): Boolean = {        s.contains(query)    }    def getMatchesFunctionReference(rdd: RDD[String]): RDD[String] = {        // 问题:"isMatch"表示"this.isMatch",因此我们要传递整个"this"        rdd.map(isMatch)    }    def getMatchesFieldReference(rdd: RDD[String]): RDD[String] = {        // 问题:"query"表示"this.query",因此我们要传递整个"this"        rdd.map(x => x.split(query))    }    def getMatchesNoReference(rdd: RDD[String]): RDD[String] = {        // 安全:只把我们需要的字段拿出来放入局部变量中        val query_ = this.query        rdd.map(x => x.split(query_))    }}
  3. 持久化(缓存)为了避免多次计算同一个RDD即多次执行rdd的action算子,可以让Spark 对数据进行持久化。在scala默认情况下persist()会把数据以序列化的形式缓存在jvm的堆空间中。

  4. collect()获取整个RDD中的数据;但是,只有当整个数据集能在单台机器的内存中放得下时,才能使用collect(),因此collect()不能用在大规模数据集上
  5. distinct() 转化操作来生成一个只包含不同元素的新RDD。不过需要注意,distinct() 操作的开销很大,因为它需要将所有数据通过网络进行混洗(shuffle),以确保每个元素都只有一份。
  6. 分区
0 0
原创粉丝点击