2023_Spark_实验十一:RDD基础算子操作

一、RDD的练习可以使用两种方式

  1. 使用Shell
  2. 使用IDEA

二、使用Shell练习RDD

当你打开 Spark 的交互式命令行界面(也就是 Spark shell)的时候,它已经自动为你准备好了一个叫做 sc 的特殊对象,这个对象是用来和 Spark 集群沟通的。你不需要,也不应该自己再创建一个这样的对象。

如果你想告诉 Spark 用哪个计算机或者计算机集群来执行你的命令,可以通过 --master 这个选项来设置。比如,你想在本地计算机上只用四个核心来运行,就可以在命令里加上 --master local[4]

bash 复制代码
$ ./bin/spark-shell --master local[4]

如果你有一些自己的代码打包成了 JAR 文件,想要在 Spark shell 里用,可以通过 --jars 选项,后面跟上你的 JAR 文件名,用逗号分隔,来把它们加入到可以识别的路径里。

bash 复制代码
$ ./bin/spark-shell --master local[4] --jars code.jar

此外,如果你需要一些额外的库或者 Spark 的扩展包,可以通过 --packages 选项,后面跟上这些库的 Maven 坐标(一种常用的依赖管理方式),用逗号分隔,来添加它们。假设你需要的包是 org.apache.spark:spark-mllib_2.13:3.4.1,这是Spark的机器学习库。

bash 复制代码
$ ./bin/spark-shell --master local[4] --packages "org.apache.spark:spark-mllib_2.13:3.4.1"

简单来说,这些选项就是让你告诉 Spark 怎么运行你的代码,以及在哪里找到运行代码所需要的资源。

RDD基础

Scala 复制代码
// 从array中创建RDD
val data = Array(1, 2, 3, 4, 5)
val distData = sc.parallelize(data)
distData.foreach(println)


// 读取文件创建RDD
val lines = sc.textFile("D:\\PycharmProjects\\2024\\pyspark\\datas\\word.txt")
val lineLengths = lines.map(s => s.length)
val totalLength = lineLengths.reduce((a, b) => a + b)
println(totalLength)

// 数据持久化
lineLengths.persist()
print(lineLengths.reduce((a, b) => a + b))


// 对象的函数
object MyFunctions {
  def func1(s: String): String = { s"打印RDD中的字符串,包含的字符串有: $s" }
}
val myRdd = lines.flatMap(lines => lines.split(" "))
myRdd.map(MyFunctions.func1).foreach(println)


import org.apache.spark.rdd.RDD
// 类的函数
class MyClass extends Serializable {
  def func1(s: String): String = { f"在MyClass类中,打印RDD中的字符串,包含的字符串有: $s" }
  def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(func1) }
}

val f1 = new MyClass()
f1.doStuff(myRdd).foreach(println)


// 类的应用
class MyClass2 extends Serializable {
  val field = "你好,测试案例..."
  def doStuff(rdd: RDD[String]): RDD[String] = { rdd.map(x => field + x) }
}
val f2 = new MyClass2()
f2.doStuff(myRdd).foreach(println)

// Pair RDD应用
val lines = sc.textFile("D:\\PycharmProjects\\2024\\pyspark\\datas\\word.txt")
val pairs = lines.flatMap(_.split(" ")).map(s => (s, 1))
val counts = pairs.reduceByKey((a, b) => a + b)
// 交换键和值的位置
val swappedCounts = counts.map(_.swap)
// 先根据值排序(降序),然后根据键排序(升序)
val sortedByValueThenKeyDesc = swappedCounts.sortByKey(ascending = false)
val CountsDescondvalue = sortedByValueThenKeyDesc .map(_.swap)
CountsDescondvalue .collect()


// 广播变量 Broadcast Variables
val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar.value

val accum = sc.longAccumulator("My Accumulator")
sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
accum.value

三、使用IDEA练习RDD

基于Spark3.4.1,IDEA练习基础的RDD

Scala 复制代码
package test

import org.apache.spark.SparkContext
import org.apache.spark.sql.SparkSession

/**
 * @projectName GNUSpark20204  
 * @package test  
 * @className test.RDD_spark341  
 * @description ${description}  
 * @author pblh123
 * @date 2024/9/26 23:08
 * @version 1.0
 *
 */
    
object RDD_spark341 extends App {

//  创建SparkSession sparkcontext
  val spark = SparkSession.builder
    .appName("RDD_spark341")
    .master("local[2]")
    .getOrCreate()
  val sc: SparkContext = spark.sparkContext

//  spark代码主体
  // 从array中创建RDD
    val data = Array(1, 2, 3, 4, 5)
    val distData = sc.parallelize(data)
    distData.foreach(println)


    // 读取文件创建RDD
    val lines = sc.textFile("D:\\PycharmProjects\\2024\\pyspark\\datas\\word.txt")
    val lineLengths = lines.map(s => s.length)
    val totalLength = lineLengths.reduce((a, b) => a + b)
    println(totalLength)

    // 数据持久化
    lineLengths.persist()
    print(lineLengths.reduce((a, b) => a + b))


    // 对象的函数
    object MyFunctions {
      def func1(s: String): String = {
        s"打印RDD中的字符串,包含的字符串有: $s"
      }
    }

    val myRdd = lines.flatMap(lines => lines.split(" "))
    myRdd.map(MyFunctions.func1).foreach(println)


    import org.apache.spark.rdd.RDD

    // 类的函数
    class MyClass extends Serializable {
      def func1(s: String): String = {
        f"在MyClass类中,打印RDD中的字符串,包含的字符串有: $s"
      }

      def doStuff(rdd: RDD[String]): RDD[String] = {
        rdd.map(func1)
      }
    }

    val f1 = new MyClass()
    f1.doStuff(myRdd).foreach(println)


    // 类的应用
    class MyClass2 extends Serializable {
      val field = "你好,测试案例..."

      def doStuff(rdd: RDD[String]): RDD[String] = {
        rdd.map(x => field + x)
      }
    }

    val f2 = new MyClass2()
    f2.doStuff(myRdd).foreach(println)

    // Pair RDD应用
    val pairs = lines.flatMap(_.split(" ")).map(s => (s, 1))
    val counts = pairs.reduceByKey((a, b) => a + b)
    // 交换键和值的位置
    val swappedCounts = counts.map(_.swap)
    // 先根据值排序(降序),然后根据键排序(升序)
    val sortedByValueThenKeyDesc = swappedCounts.sortByKey(ascending = false)
    val CountsDescondvalue = sortedByValueThenKeyDesc.map(_.swap)
    println(CountsDescondvalue.collect())


    // 广播变量 Broadcast Variables
    val broadcastVar = sc.broadcast(Array(1, 2, 3))
    println(broadcastVar.value)

    val accum = sc.longAccumulator("My Accumulator")
    sc.parallelize(Array(1, 2, 3, 4)).foreach(x => accum.add(x))
    println(accum.value)

//  关闭sparkSesssion sparkcontext
  sc.stop()
  spark.stop()

}
相关推荐
武子康8 小时前
大数据-242 离线数仓 - DataX 实战:MySQL 全量/增量导入 HDFS + Hive 分区(离线数仓 ODS
大数据·后端·apache hive
SelectDB1 天前
易车 × Apache Doris:构建湖仓一体新架构,加速 AI 业务融合实践
大数据·agent·mcp
武子康2 天前
大数据-241 离线数仓 - 实战:电商核心交易数据模型与 MySQL 源表设计(订单/商品/品类/店铺/支付)
大数据·后端·mysql
茶杯梦轩2 天前
从零起步学习RabbitMQ || 第三章:RabbitMQ的生产者、Broker、消费者如何保证消息不丢失(可靠性)详解
分布式·后端·面试
IvanCodes2 天前
一、消息队列理论基础与Kafka架构价值解析
大数据·后端·kafka
武子康3 天前
大数据-240 离线数仓 - 广告业务 Hive ADS 实战:DataX 将 HDFS 分区表导出到 MySQL
大数据·后端·apache hive
回家路上绕了弯3 天前
深入解析Agent Subagent架构:原理、协同逻辑与实战落地指南
分布式·后端
字节跳动数据平台3 天前
5000 字技术向拆解 | 火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据
武子康4 天前
大数据-239 离线数仓 - 广告业务实战:Flume 导入日志到 HDFS,并完成 Hive ODS/DWD 分层加载
大数据·后端·apache hive
字节跳动数据平台4 天前
代码量减少 70%、GPU 利用率达 95%:火山引擎多模态数据湖如何释放模思智能的算法生产力
大数据