【Spark】Spark基础练习题(一)

题目:

1、创建一个1-10数组的RDD,将所有元素*2形成新的RDD

2、创建一个10-20数组的RDD,使用mapPartitions将所有元素*2形成新的RDD

3、创建一个元素为 1-5 的RDD,运用 flatMap创建一个新的 RDD,新的 RDD 为原 RDD 每个元素的 平方和三次方 来组成 1,1,4,8,9,27…

4、创建一个 4 个分区的 RDD数据为Array(10,20,30,40,50,60),使用glom将每个分区的数据放到一个数组

5、创建一个 RDD数据为Array(1, 3, 4, 20, 4, 5, 8),按照元素的奇偶性进行分组

6、创建一个 RDD(由字符串组成)Array(“xiaoli”, “laoli”, “laowang”, “xiaocang”, “xiaojing”, “xiaokong”),过滤出一个新 RDD(包含“xiao”子串)

7、创建一个 RDD数据为1 to 10,请使用sample不放回抽样

8、创建一个 RDD数据为1 to 10,请使用sample放回抽样

9、创建一个 RDD数据为Array(10,10,2,5,3,5,3,6,9,1),对 RDD 中元素执行去重操作

10、创建一个分区数为5的 RDD,数据为0 to 100,之后使用coalesce再重新减少分区的数量至 2

11、创建一个分区数为5的 RDD,数据为0 to 100,之后使用repartition再重新减少分区的数量至 3

12、创建一个 RDD数据为1,3,4,10,4,6,9,20,30,16,请给RDD进行分别进行升序和降序排列

13、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,求并集

14、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算差集,两个都算

15、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算交集

16、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算 2 个 RDD 的笛卡尔积

17、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 5和11 to 15,对两个RDD拉链操作

18、创建一个RDD数据为List((“female”,1),(“male”,5),(“female”,5),(“male”,2)),请计算出female和male的总数分别为多少

19、创建一个有两个分区的 RDD数据为List((“a”,3),(“a”,2),(“c”,4),(“b”,3),(“c”,6),(“c”,8)),取出每个分区相同key对应值的最大值,然后相加

20、 创建一个有两个分区的 pairRDD数据为Array((“a”, 88), (“b”, 95), (“a”, 91), (“b”, 93), (“a”, 95), (“b”, 98)),根据 key 计算每种 key 的value的平均值

21、统计出每一个省份广告被点击次数的 TOP3,数据在access.log文件中
数据结构:时间戳,省份,城市,用户,广告 字段使用空格分割。
样本如下:
1516609143867 6 7 64 16
1516609143869 9 4 75 18
1516609143869 1 7 87 12

22、读取本地文件words.txt,统计出每个单词的个数,保存数据到 hdfs 上

23、读取 people.json 数据的文件, 每行是一个 json 对象,进行解析输出

24、保存一个 SequenceFile 文件,使用spark创建一个RDD数据为
Array((“a”, 1),(“b”, 2),(“c”, 3)),保存为SequenceFile格式的文件到hdfs上

25、读取24题的SequenceFile 文件并输出

26、读写 objectFile 文件,把 RDD 保存为objectFile,RDD数据为Array((“a”, 1),(“b”, 2),(“c”, 3)),并进行读取出来

27、使用内置累加器计算Accumulator.txt文件中空行的数量

28、使用Spark广播变量
用户表:
id name age gender(0|1)
001,刘向前,18,0
002,冯 剑,28,1
003,李志杰,38,0
004,郭 鹏,48,2
要求,输出用户信息,gender必须为男或者女,不能为0,1
使用广播变量把Map(“0” -> “女”, “1” -> “男”)设置为广播变量,最终输出格式为
001,刘向前,18,女
003,李志杰,38,女
002,冯 剑,28,男
004,郭 鹏,48,男

29、mysql创建一个数据库bigdata0407,在此数据库中创建一张表
CREATE TABLE user (
id int(11) NOT NULL AUTO_INCREMENT,
username varchar(32) NOT NULL COMMENT ‘用户名称’,
birthday date DEFAULT NULL COMMENT ‘生日’,
sex char(1) DEFAULT NULL COMMENT ‘性别’,
address varchar(256) DEFAULT NULL COMMENT ‘地址’,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
数据如下:
依次是:姓名 生日 性别 省份
安荷 1998/2/7 女 江苏省
白秋 2000/3/7 女 天津市
雪莲 1998/6/7 女 湖北省
宾白 1999/7/3 男 河北省
宾实 2000/8/7 男 河北省
斌斌 1998/3/7 男 江苏省
请使用spark将以上数据写入mysql中,并读取出来。

30、在hbase中创建一个表student,有一个 message列族
create ‘student’, ‘message’
scan ‘student’, {COLUMNS => ‘message’}
给出以下数据,请使用spark将数据写入到hbase中的student表中,并进行查询出来
数据如下:
依次是:姓名 班级 性别 省份,对应表中的字段依次是:name,class,sex,province
飞松 3 女 山东省
刚洁 1 男 深圳市
格格 4 女 四川省
谷菱 5 女 河北省
国立 2 男 四川省
海涛 3 男 广东省
含芙 3 女 四川省
华敏 4 女 上海市
乐和 2 男 上海市
乐家 3 男 黑龙江
乐康 4 男 湖北省
乐人 5 男 四川省
乐水 3 男 北京市
乐天 4 男 河北省
乐童 5 男 江苏省
乐贤 1 男 陕西省
乐音 2 男 广东省
李仁 3 男 湖北省
立涛 3 女 陕西省
凌青 4 女 湖北省
陆涛 4 男 山东省
媚媚 5 女 河南省
梦亿 4 男 江苏省
铭忠 5 男 四川省
慕梅 3 女 北京市
鹏吉 1 男 上海市
娉婷 4 女 河南省
淇峰 2 男 广东省
庆元 3 男 上海市
庆滋 4 男 北京市
丘东 5 男 江苏省
荣郑 1 男 黑龙江
蕊蕊 5 女 四川省
尚凯 2 男 北京市
诗涵 1 女 河南省
淑凤 2 女 天津市
淑娇 3 女 上海市
淑燕 4 女 河北省
淑怡 4 女 广东省
思璇 2 女 湖北省
苏华 3 女 山东省
苏梅 4 女 四川省
听荷 5 女 深圳市
文怡 1 女 天津市
文怡 2 女 河北省
香凝 3 女 山东省
翔云 4 女 河南省
小芸 5 女 深圳市

答案:

package scala

import org.apache.hadoop.hbase.{Cell, CellUtil, HBaseConfiguration}
import org.apache.hadoop.hbase.client.{Put, Result}
import org.apache.hadoop.hbase.io.ImmutableBytesWritable
import org.apache.hadoop.hbase.mapred.TableOutputFormat
import org.apache.hadoop.hbase.mapreduce.TableInputFormat
import org.apache.hadoop.hbase.util.Bytes
import org.apache.hadoop.mapred.JobConf
import org.apache.spark.rdd.{JdbcRDD, RDD}
import org.apache.spark.{SparkConf, SparkContext}

object demo02 {


  val sc: SparkContext = new SparkContext(new SparkConf().setMaster("local").setAppName("demo02"))
  // 1、创建一个1-10数组的RDD,将所有元素*2形成新的RDD
  val data1 = sc.makeRDD(1 to 10)
  val data1Result = data1.map(_ * 2)

  // 2、创建一个10-20数组的RDD,使用mapPartitions将所有元素*2形成新的RDD
  val data2 = sc.makeRDD(10 to 20)
  val data2Result = data2.mapPartitions(_.map(_ * 2))

  // 3、创建一个元素为 1-5 的RDD,运用 flatMap创建一个新的 RDD,新的 RDD 为原 RDD 每个元素的 平方和三次方 来组成 1,1,4,8,9,27..
  val data3 = sc.makeRDD(1 to 5)
  val data3Result = data3.flatMap(x => Array(math.pow(x, 2), math.pow(x, 3)))

  // 4、创建一个 4 个分区的 RDD数据为Array(10,20,30,40,50,60),使用glom将每个分区的数据放到一个数组
  val data4 = sc.makeRDD(Array(10, 20, 30, 40, 50, 60))
  val data4Result = data4.glom()

  // 5、创建一个 RDD数据为Array(1, 3, 4, 20, 4, 5, 8),按照元素的奇偶性进行分组
  val data5 = sc.makeRDD(Array(1, 3, 4, 20, 4, 5, 8))
  val data5Result = data5.groupBy(x => if (x % 2 == 0) "偶数" else "奇数")

  // 6、创建一个 RDD(由字符串组成)Array("xiaoli", "laoli", "laowang", "xiaocang", "xiaojing", "xiaokong"),过滤出一个新 RDD(包含“xiao”子串)
  val data6 = sc.makeRDD(Array("xiaoli", "laoli", "laowang", "xiaocang", "xiaojing", "xiaokong"))
  val data6Result = data6.filter(_.contains("xiao"))

  // 7、创建一个 RDD数据为1 to 10,请使用sample不放回抽样
  val data7 = sc.makeRDD(1 to 10)
  val data7Result = data7.sample(false, 0.5, 1)

  // 8、创建一个 RDD数据为1 to 10,请使用sample放回抽样
  val data8 = sc.makeRDD(1 to 10)
  val data8Result = data8.sample(true, 0.5, 1)

  // 9、创建一个 RDD数据为Array(10,10,2,5,3,5,3,6,9,1),对 RDD 中元素执行去重操作
  val data9 = sc.makeRDD(Array(10, 10, 2, 5, 3, 5, 3, 6, 9, 1))
  val data9Result = data9.distinct()

  // 10、创建一个分区数为5的 RDD,数据为0 to 100,之后使用coalesce再重新减少分区的数量至 2
  val data10 = sc.makeRDD(0 to 100, 5)
  val data10Result = data10.coalesce(2)

  // 11、创建一个分区数为5的 RDD,数据为0 to 100,之后使用repartition再重新减少分区的数量至 3
  val data11 = sc.makeRDD(0 to 100, 5)
  val data11Result = data11.repartition(3)

  // 12、创建一个 RDD数据为1,3,4,10,4,6,9,20,30,16,请给RDD进行分别进行升序和降序排列
  val data12 = sc.makeRDD(Array(1, 3, 4, 10, 4, 6, 9, 20, 30, 16))
  val data12Result1 = data12.sortBy(x => x)
  val data12Result2 = data12.sortBy(x => x, false)

  // 13、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,求并集
  val data13_1 = sc.makeRDD(1 to 6)
  val data13_2 = sc.makeRDD(4 to 10)
  val data13Result = data13_1.union(data13_2)

  // 14、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算差集,两个都算
  val data14_1 = sc.makeRDD(1 to 6)
  val data14_2 = sc.makeRDD(4 to 10)
  val data14Result_1 = data14_1.subtract(data14_2)
  val data14Result_2 = data14_2.subtract(data14_1)

  // 15、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算交集
  val data15_1 = sc.makeRDD(1 to 6)
  val data15_2 = sc.makeRDD(4 to 10)
  val data15Result_1 = data15_1.intersection(data15_2)

  // 16、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 6和4 to 10,计算 2 个 RDD 的笛卡尔积
  val data16_1 = sc.makeRDD(1 to 6)
  val data16_2 = sc.makeRDD(4 to 10)
  val data16Result = data16_1.cartesian(data16_2)

  // 17、创建两个RDD,分别为rdd1和rdd2数据分别为1 to 5和11 to 15,对两个RDD拉链操作
  val data17_1 = sc.makeRDD(1 to 5)
  val data17_2 = sc.makeRDD(11 to 15)
  val data17Result = data17_1.zip(data17_2)

  // 18、创建一个RDD数据为List(("female",1),("male",5),("female",5),("male",2)),请计算出female和male的总数分别为多少
  val data18 = sc.makeRDD(List(("female", 1), ("male", 5), ("female", 5), ("male", 2)))
  val data18Result = data18.reduceByKey(_ + _)

  // 19、创建一个有两个分区的 RDD数据为List(("a",3),("a",2),("c",4),("b",3),("c",6),("c",8)),取出每个分区相同key对应值的最大值,然后相加
  /**
    * (a,3),(a,2),(c,4)
    * (b,3),(c,6),(c,8)
    */
  val data19 = sc.makeRDD(List(("a", 3), ("a", 2), ("c", 4), ("b", 3), ("c", 6), ("c", 8)), 2)
  data19.glom().collect().foreach(x => println(x.mkString(",")))
  val data19Result = data19.aggregateByKey(0)(math.max(_, _), _ + _)

  // 20、创建一个有两个分区的 pairRDD数据为Array(("a", 88), ("b", 95), ("a", 91), ("b", 93), ("a", 95), ("b", 98)),根据 key 计算每种 key 的value的平均值
  val data20 = sc.makeRDD(Array(("a", 88), ("b", 95), ("a", 91), ("b", 93), ("a", 95), ("b", 98)))
  val data20Result = data20.map(x => (x._1, (x._2, 1))).reduceByKey((x, y) => (x._1 + y._1, x._2 + y._2)).map(x => (x._1, x._2._1 / x._2._2))

  // 21、统计出每一个省份广告被点击次数的 TOP3,数据在access.log文件中
  // 数据结构:时间戳,省份,城市,用户,广告 字段使用空格分割。
  val file1 = sc.textFile("input20200407/access.log")
  file1.map { x => var datas = x.split(" "); (datas(1), (datas(4), 1)) }.groupByKey().map {
    case (province, list) => {
      val tuples = list.groupBy(_._1).map(x => (x._1, x._2.size)).toList.sortWith((x, y) => x._2 > y._2).take(3)
      (province, tuples)
    }
  }.collect().sortBy(_._1).foreach(println)

  // 22、读取本地文件words.txt,统计出每个单词的个数,保存数据到 hdfs 上
  val file2 = sc.textFile("file:///F:\\study\\题库\\大数据题库\\words.txt")
  file2.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _).saveAsTextFile("hdfs://node01:8020/20200407_wordsOutput")

  // 23、读取 people.json 数据的文件, 每行是一个 json 对象,进行解析输出
  import scala.util.parsing.json.JSON

  val file3 = sc.textFile("input20200407/people.json")
  val result: RDD[Option[Any]] = file3.map(JSON.parseFull)

  // 24、保存一个 SequenceFile 文件,使用spark创建一个RDD数据为Array(("a", 1),("b", 2),("c", 3)),保存为SequenceFile格式的文件到hdfs上
  val data24 = sc.makeRDD(Array(("a", 1), ("b", 2), ("c", 3)))
  data24.saveAsSequenceFile("hdfs://node01:8020/20200407_SequenceFile")

  // 25、读取24题的SequenceFile 文件并输出
  val data25: RDD[(String, Int)] = sc.sequenceFile[String, Int]("hdfs://node01:8020/20200407_SequenceFile/part-00000")

  // 26、读写 objectFile 文件,把 RDD 保存为objectFile,RDD数据为Array(("a", 1),("b", 2),("c", 3)),并进行读取出来
  val data26_1 = sc.makeRDD(Array(("a", 1), ("b", 2), ("c", 3)))
  data26_1.saveAsObjectFile("output20200407/20200407_objectFile")
  val data26_2 = sc.objectFile("output20200407/20200407_objectFile")

  // 27、使用内置累加器计算Accumulator.txt文件中空行的数量
  val data27 = sc.textFile("input20200407/Accumulator.txt")
  var count = sc.longAccumulator("count")
  data27.foreach { x => if (x == "") count.add(1) }
  println(count.value)

  /**
    * 28、使用Spark广播变量
    * 用户表:
    * id name age gender(0|1)
    * 001,刘向前,18,0
    * 002,冯  剑,28,1
    * 003,李志杰,38,0
    * 004,郭  鹏,48,1
    * 要求,输出用户信息,gender必须为男或者女,不能为0,1
    * 使用广播变量把Map("0" -> "女", "1" -> "男")设置为广播变量,最终输出格式为
    * 001,刘向前,18,女
    * 003,李志杰,38,女
    * 002,冯  剑,28,男
    * 004,郭  鹏,48,男
    */
  val data28 = sc.textFile("input20200407/user.txt")
  val sex = sc.broadcast(Map("0" -> "女", "1" -> "男"))
  data28.foreach { x => var datas = x.split(","); println(datas(0) + "," + datas(1) + "," + datas(2) + "," + sex.value(datas(3))) }

  /**
    * 29、mysql创建一个数据库bigdata0407,在此数据库中创建一张表
    * CREATE TABLE `user` (
    * `id` int(11) NOT NULL AUTO_INCREMENT,
    * `username` varchar(32) NOT NULL COMMENT '用户名称',
    * `birthday` date DEFAULT NULL COMMENT '生日',
    * `sex` char(1) DEFAULT NULL COMMENT '性别',
    * `address` varchar(256) DEFAULT NULL COMMENT '地址',
    * PRIMARY KEY (`id`)
    * ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
    * 数据如下:
    * 依次是:姓名 生日 性别 省份
    * 安荷 1998/2/7 女 江苏省
    * 白秋 2000/3/7 女 天津市
    * 雪莲 1998/6/7 女 湖北省
    * 宾白 1999/7/3 男 河北省
    * 宾实 2000/8/7 男 河北省
    * 斌斌 1998/3/7 男 江苏省
    * 请使用spark将以上数据写入mysql中,并读取出来。
    */
  val data29 = sc.textFile("input20200407/users.txt")
  val driver = "com.mysql.jdbc.Driver"
  val url = "jdbc:mysql://localhost:3306/bigdata0407"
  val username = "root"
  val password = "root"
  /**
    * MySQL插入数据
    */
  data29.foreachPartition {
    data =>
      Class.forName(driver)
      val connection = java.sql.DriverManager.getConnection(url, username, password)
      val sql = "INSERT INTO `user` values (NULL,?,?,?,?)"
      data.foreach {
        tuples => {
          val datas = tuples.split(" ")
          val statement = connection.prepareStatement(sql)
          statement.setString(1, datas(0))
          statement.setString(2, datas(1))
          statement.setString(3, datas(2))
          statement.setString(4, datas(3))
          statement.executeUpdate()
          statement.close()
        }
      }
      connection.close()
  }
  /**
    * MySQL查询数据
    */
  var sql = "select * from `user` where id between ? and ?"
  val jdbcRDD = new JdbcRDD(sc,
    () => {
      Class.forName(driver)
      java.sql.DriverManager.getConnection(url, username, password)
    },
    sql,
    0,
    44,
    3,
    result => {
      println(s"id=${result.getInt(1)},username=${result.getString(2)}" +
        s",birthday=${result.getDate(3)},sex=${result.getString(4)},address=${result.getString(5)}")
    }
  )
  jdbcRDD.collect()


  /**
    * 30、在hbase中创建一个表student,有一个 message列族
    * create 'student', 'message'
    * scan 'student', {COLUMNS => 'message'}
    * 给出以下数据,请使用spark将数据写入到hbase中的student表中,并进行查询出来
    * 数据如下:
    * 依次是:姓名 班级 性别 省份,对应表中的字段依次是:name,class,sex,province
    */
  //org.apache.hadoop.hbase.mapreduce.TableInputFormat
  val conf = HBaseConfiguration.create()
  conf.set("hbase.zookeeper.quorum", "node01:2181,node02:2181,node03:2181")
  conf.set(TableInputFormat.INPUT_TABLE, "student")
  /**
    * HBase插入数据
    */
  val dataRDD: RDD[String] = sc.textFile("input20200407/student.txt")
  val putRDD: RDD[(ImmutableBytesWritable, Put)] = dataRDD.map {
    //飞松	3	女	山东省
    case line => {
      val datas = line.split("\t")
      val rowkey = Bytes.toBytes(datas(0))
      val put = new Put(rowkey)
      put.addColumn(Bytes.toBytes("message"), Bytes.toBytes("name"), Bytes.toBytes(datas(0)))
      put.addColumn(Bytes.toBytes("message"), Bytes.toBytes("class"), Bytes.toBytes(datas(1)))
      put.addColumn(Bytes.toBytes("message"), Bytes.toBytes("sex"), Bytes.toBytes(datas(2)))
      put.addColumn(Bytes.toBytes("message"), Bytes.toBytes("province"), Bytes.toBytes(datas(3)))
      (new ImmutableBytesWritable(rowkey), put)
    }
  }
  val jobConf = new JobConf(conf)
  //org.apache.hadoop.hbase.mapred.TableOutputFormat
  jobConf.setOutputFormat(classOf[TableOutputFormat])
  jobConf.set(TableOutputFormat.OUTPUT_TABLE, "student")
  putRDD.saveAsHadoopDataset(jobConf)


  /**
    * HBase查询数据
    */
  val hbaseRDD: RDD[(ImmutableBytesWritable, Result)] = sc.newAPIHadoopRDD(conf, classOf[TableInputFormat],
    classOf[ImmutableBytesWritable],
    classOf[Result])
  hbaseRDD.foreach {
    case (rowKey, result) => {
      val cells: Array[Cell] = result.rawCells()
      for (cell <- cells) {
        println(Bytes.toString(CellUtil.cloneRow(cell)) + "\t" +
          Bytes.toString(CellUtil.cloneFamily(cell)) + "\t" +
          Bytes.toString(CellUtil.cloneQualifier(cell)) + "\t" +
          Bytes.toString(CellUtil.cloneValue(cell))
        )
      }
    }
  }
}

  • 2
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,下面是回复: 【SparkSpark基础练习题(二)是一组用于练习Spark基础知识的题目。这些题目涵盖了Spark的常用操作,包括RDD的创建、转换和行动操作,以及Spark SQL的使用等。通过完成这些练习题,可以加深对Spark的理解和掌握,提高Spark编程能力。 ### 回答2: Spark 基础练习题2主要涉及到 Spark Core 和 Spark SQL。其中,Spark Core 是 Spark基础的模块,它包含了 Spark 的所有基本组件,如 RDDSparkConf、SparkContext 和 Task 等,是使用 Spark 的起点。Spark SQL 则是 Spark 中处理结构化数据的核心模块,使用起来非常方便,能够快速地完成数据的查询和处理。 针对这道练习题,首先需要了解 Spark Core。Spark Core 中最重要的概念是 RDD(Resilient Distributed Dataset,弹性分布式数据集),它是一种分布式的内存计算模型,也是 Spark 进行数据处理的核心数据结构。在处理数据时,可以使用 RDD数据进行转换和操作,比如 map、filter、reduce、join 等操作。SparkContext 是 Spark 的入口点,它负责和集群进行通信,并控制整个应用程序的运行流程。另外,SparkConf 是 Spark 的配置管理器,可以指定一些应用程序的运行参数。 对于 Spark SQL,它采用的是类似于传统 SQL 的结构化查询语言,可以让用户使用 SQL 语句对数据进行查询和分析。在 Spark SQL 中,最常用的 API 是 DataFrame 和 Dataset。DataFrame 是以列为主导的数据结构,可以将它看成是关系型数据库中的表,它提供了灵活的编程和数据处理方式。Dataset 则是对 DataFrame 进行的补充,它将 DataFrame 转换成类型化的数据集合,提供了更好的类型检查和运行时安全。 综上所述,Spark 基础练习题2需要掌握 Spark Core 和 Spark SQL 的基础概念,并能够用它们进行数据处理和分析。需要注意的是,这里只是一个简单的练习题,如果想要真正学好 Spark,还需要深入学习 Spark 的各个模块和外部组件,比如 Spark Streaming、Spark MLlib 等,并掌握其高级应用场景。 ### 回答3: Spark是一个开源的分布式计算框架,可以用来加速大规模数据处理。在Spark中,一个重要的概念是Resilient Distributed Datasets(RDD),它是Spark分布式数据处理的基本单元。本文将介绍Spark基础练习题(二),帮助大家更好地理解和掌握Spark。 1. 定义RDD RDD是Resilient Distributed Datasets的缩写,它是Spark中最基本的分布式数据结构。RDD是一个只读的、可分区、可并行计算数据集合,支持多种数据源,包括Hadoop Distributed File System(HDFS)、本地文件系统以及其他支持Hadoop InputFormat的数据源。在Spark中,RDD可以通过各种操作转换和处理,例如map、filter、reduce等,同时支持缓存和持久化,可以提供高效的内存计算数据共享。 2. RDD的特点 RDD具有以下特点: - 分布式处理:RDD可以在Spark集群中分布式存储、计算和处理数据,支持高效的数据共享和并行计算。 - 可靠性和容错性:RDD具备不可变性,即一旦创建就不能修改。它可以通过记录分区的变换历史来实现容错性,如果某个分区数据丢失或失效,可以重新计算。 - 惰性计算RDD是一种惰性计算模型,支持高效的转换和操作,但只有在需要输出结果时才会真正计算。 - 可缓存和持久化:通过缓存和持久化机制,可以提高计算效率和速度,减少重复计算。 3. 创建RDDSpark中,可以通过多种方式创建RDD,常用的有以下几种: - 从本地文件系统创建:使用SparkContext的textFile方法,可以将本地文件系统中的文件读入为RDD: ``` val fileRDD = sc.textFile("file:///path/to/file") ``` - 从HDFS创建:使用SparkContext的textFile方法或Hadoop API读取HDFS文件创建RDD: ``` val hdfsRDD = sc.textFile("hdfs://namenode:8020/path/to/file") ``` - 通过并行化集合创建:使用SparkContext的parallelize方法,可以创建一个包含给定集合中所有元素的RDD: ``` val listRDD = sc.parallelize(List(1, 2, 3, 4, 5)) ``` 4. RDD的转换操作 RDD支持多种转换操作,常用的有以下几种: - map:对RDD中的每个元素应用一个函数,返回一个新的RDD。 ``` val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5)) val rdd2 = rdd1.map(_ * 2) ``` - filter:根据给定的条件过滤RDD中的元素,返回一个新的RDD。 ``` val rdd1 = sc.parallelize(List(1, 2, 3, 4, 5)) val rdd2 = rdd1.filter(_ % 2 == 0) ``` - flatMap:对每个元素应用一个函数,并将结果展开为一个新的RDD。 ``` val rdd1 = sc.parallelize(List("Hello world", "Spark is great")) val rdd2 = rdd1.flatMap(_.split(" ")) ``` - union:将两个RDD合并为一个新的RDD。 ``` val rdd1 = sc.parallelize(List(1, 2, 3)) val rdd2 = sc.parallelize(List(4, 5, 6)) val rdd3 = rdd1.union(rdd2) ``` 5. RDD的行动操作 行动操作是指对RDD进行计算并返回结果的操作。常用的行动操作有以下几种: - count:返回RDD中元素的个数。 ``` val rdd = sc.parallelize(List(1, 2, 3, 4, 5)) val count = rdd.count() ``` - reduce:对RDD中的元素进行累加或拼接等操作。 ``` val rdd = sc.parallelize(List(1, 2, 3, 4, 5)) val sum = rdd.reduce(_ + _) ``` - collect:将RDD中的所有元素以数组的形式返回。 ``` val rdd = sc.parallelize(List(1, 2, 3, 4, 5)) val array = rdd.collect() ``` - foreach:对RDD中的每个元素应用一个函数。 ``` val rdd = sc.parallelize(List(1, 2, 3, 4, 5)) rdd.foreach(println) ``` 以上是Spark基础练习题(二)的简单介绍,通过熟练掌握和练习这些操作,相信大家能够更好地理解和应用Spark分布式计算框架,提高大数据处理的效率和速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值