spark学习笔记

rdd 创建

从集合创建
//底层调用 paralllize方法
sparkContext.makeRDD(List[1,2,3,4])

//paralllize 并行 
sparkContext.paralllize(Seq[Int](1,2,3,4))
从文件创建

sparkContext.textFile(“path”) //以行为单位读取 不考虑数据来源

sparkContext.wholeTextFiles(“path”) //以文件为单位,读取到的为元组,第一个元素为文件路径

rdd 并行和分区

makeRDD()方法可以传递第二个参数 numSlices 设置分区数量
第二个参数可以不传递,那么 方法将使用默认值: defaultParallelism
defaultParallelism = scheduler.conf.getInt(“spark.default.parallelism”, totalCores)

spark 默认情况下从sparkConf 中获取配置参数:spark.default.parallelism,如果获取不到,那么使用属性 totalCores

textFile 取最小分区 defaultMinPartitions: Int = math.min(defaultParallelism, 2)

rdd 算子

转化算子
  • map 分区内的数据执行是有序的,不同分区数据计算是无序的

  • mapPartition 以分区为单位进行数据转化操作,但是会将整个分区的数据加载到内存中进行引用,处理完的数据不会释放,因为存在引用,数据量较大,内存较小时 可能导致内存溢出

  • mapPartitionsWithIndex() 以分区为单位对数据进行处理,在处理的同时可以获取当前分区的索引

  • flatMap 扁平映射

  • glom 将同一分区的数据直接转化为相同类型的内存数组,进行处理,数据分区不变

  • groupby 将数据根据指定的规则进行分组,分区默认不变,但数据会被打乱重新组合(重分区),这样的过程称为 shuffle
    一个组的数据在一个分区中,但并不是一个分区中只有一个组的数据

  • filter 对数据按照指定的规则进行过滤筛选,符合规则的数据保留,不符合的丢弃,进行数据筛选后分区不变,可能导致分区内数据不均衡,可能出现数据倾斜

  • distinct 底层去重原理:

 case _ => map(x => (x, null)).reduceByKey((x, _) => x, numPartitions).map(_._1)
  • coalesce 指定分区数量 进行重分区,可以选择是否shuffle,若不进行shuffle 则不会打乱数据
rdd.coalesce(2,true)
  • repartition 重分区 底层使用coalesce 默认进行shuffle

  • sortBy 根据指定规则进行排序,默认升序,第二参数传递false 为降序

  • 双value 操作
    要求两个数据源的数据类型保持一致

// 交集 
rdd1.intersection(rdd2)

//并集
rdd1.union(rdd2)

//差集
rdd1.subtract(rdd2)

  • partitionBy 根据指定的分区规则对数据进行重分区

  • reduceByKey 相同的key的数据进行value 聚合的操作

  • groupByKey 相同的key的数据分在一个组中,形成一个对偶元组 :元组中第一个元素就是key, 第二个元素就是相同key 对应的 value 集合

区别:reduceByKey 底层会先在分区内进行聚合(combine 预聚合),可以有效减少shuffle的数据量,进而提高shuffle性能,因此reduceBykey 性能会优于 groupByKey

  • aggregateByKey 按照指定分区内和分区间的聚合规则,对数据进行聚合操作
rdd.aggregateByKey(0)((x, y) => math.max(x, y), _ + _)

第1个参数列表 的参数 表示初始值

第二个参数列表:第1个参数 分组内聚合的规则
第2个参数 分组间的规则

  • 若分组内和分组间的聚合规则相同,可采用 foldByKey, 如上可写为:
rdd.foldByKey(0)(_ + _)
  • combineByKey 可以指定分组内的数据为初始值,直接进行聚合,
    接收3个参数,第1个参数:分组内第一次出现的key 的初始化
    第1个参数:分组内聚合规则
    第1个参数:分组间聚合规则

如下两个rddavg 的值完全相同,区别是aggregateByKey 指定一个(0,0)元组作为初始值,combineByKey 指定组内第一个key的数据的初始化规则


val rddavgTuple = rdd.aggregateByKey((0, 0))((t, v) => (t._1 + v, t._2 + 1), (t1, t2) => (t1._1 + t2._1, t1._2 + t2._2))

val rddavgTuple2 = rdd.combineByKey((_, 1),
      (t:(Int,Int), v) => (t._1 + v, t._2 + 1),
      (t1:(Int,Int), t2:(Int,Int)) => (t1._1 + t2._1, t1._2 + t2._2))

    val rddavg1 = rddavgTuple.mapValues { case (sum, cnt) => {sum / cnt}}

    val rddavg2 = rddavgTuple.mapValues { case (sum, cnt) => {sum / cnt}}

行动算子
  • reduce 将数据源中的数据两两聚合
val rdd = sc.makeRDD(Seq[Int](1, 2, 3, 4, 5))
println(rdd.reduce(_ + _))
  • collect 会将不同的分区数据按照分区数据采集到driver 内存中,形成数组

  • count 获取数据源中数据的个数

  • first 获取数据源中的第一个

  • take(N) 获取取 N 条数据

  • takeOrdered(N) 排序后取 N 条


   //val ints = rdd2.takeOrdered(3) //默认升序 取前三

   val ints = rdd2.takeOrdered(3)(Ordering.Int.reverse)  //降序 取前三
    println(ints.mkString(","))
  • aggregate 分区数据通过初始值和分区内数据进行聚合,然后再和初始值和分区间数据聚合
val rdd = sc.makeRDD(Seq[Int](1, 2, 3, 4, 5), 2)
val i = rdd.aggregate(0)(_ + _, _ * _)
//结果为 0

  • fold aggregate算子的简化 分区内和分区间的规则相同时使用fold

  • countByValue 计算数据源 相同 value 的 个数,返回 map

  val value = sc.makeRDD(List("spark hadoop", "hbase spark", "spark test"))
  val res = value.flatMap(_.split(" ")).countByValue()
  res.foreach(println(_))
  • countByKey 计算数据源 相同 key 的 个数,返回 map (数据源需为键值类型)
 val value = sc.makeRDD(List(("a", 1), ("b", 2), ("a", 3)))
 val count = value.countByKey()
 count.foreach(println(_))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark SQL是Apache Spark中的一个模块,它提供了一种基于结构化数据的编程接口。Spark SQL可以让用户使用SQL语句来查询数据,也可以让用户使用DataFrame API来进行数据处理和分析。Spark SQL支持多种数据源,包括Hive、JSON、Parquet等。Spark SQL还提供了一些高级功能,如支持用户自定义函数、支持分布式机器学习算法等。Spark SQL的目标是让用户能够方便地使用Spark进行数据处理和分析,同时提供高性能和可扩展性。 ### 回答2: Spark SQL是一个基于Spark平台的关系型数据处理引擎,它支持使用SQL语句和数据框架操作数据,可以轻松处理结构化和半结构化的数据。它可以从多个数据源中读取数据,包括Hive、JSON、Parquet、ORC等。通过Spark SQL,用户可以方便地使用SQL查询语言来分析和处理数据,大大降低了开发和组织数据流的难度。 Spark SQL主要有两种执行模式:SQL查询和DataFrame操作。其中SQL查询基于Hive的SQL语法解析器,支持HiveQL中的大多数语言特性(如UDF、窗口函数等)。在执行计划生成时,Spark SQL采用了Spark的计算引擎,支持各种Spark算子的优化,以便最大程度地提高查询性能。 另一种操作模式是使用DataFrame API,它可以灵活地进行数据转换和处理,并提供了类似于SQL的语法。与SQL查询不同,DataFrame API通过静态检查和编译器优化来避免由SQL查询引起的语法错误和潜在性能问题。 除了这两种基本的操作模式外,Spark SQL还提供了一些高级特性,如嵌套查询、表和视图、共享变量等。这些特性扩展了Spark SQL的功能,使得它可以更加灵活地进行数据处理和查询。 Spark SQL是Spark的重要组成部分,它在数据存储和处理方面提供了很多便利。通过最大程度地利用Spark引擎的优势,Spark SQL能够处理海量数据,并将其转换为有用的信息。这使得Spark SQL成为实现数据分析、机器学习和人工智能的重要工具之一。 ### 回答3: Spark SQL是一种基于Spark平台的数据处理引擎,它提供了高度优化的查询引擎和优秀的支持SQL语句的API。它允许用户使用SQL语句查询来处理大规模数据集,同时仍然支持复杂数据类型和计算。Spark SQL支持数据源,包括Parquet,Avro,JSON等一系列结构化的和半结构化的数据源。 Spark SQL在历史上是一个单独的模块,在Spark 2.0之后,它已经成为Spark的核心组件之一,可以直接在Spark核心API中使用,包括作为一个RDD库或DataFrame/DataSet的API。 Spark SQL的优点如下: 1. 它可以向受过传统SQL培训的用户展示更高级别,更强大的API。 2. 它提供数据集和RDD的良好互操作性。Spark SQL可以通过未被优化的RDD/DataSet API访问同一数据。 3. 它支持Spark的执行引擎以加速查询处理。 使用Spark SQL的时候,可以根据需要选择编程语言,如Scala,Java,Python,SQL等。在Spark核心API中,Spark SQL提供了两种API来处理结构化数据: 1. DataFrame API:DataFrame是具有许多操纵数据的功能的分布式数据集,类似于数据库中的表。 2. Dataset API:Dataset是Scala和Java API,它是类型安全的,并且提供与RDD API相同的API,但比RDD具有更好的性能和可读性。 Spark SQL是Spark生态系统中重要的组成部分之一。在处理大规模数据时,使用Spark SQL可以方便地利用Spark的强大功能,提高处理效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值