林子雨spark scala版编程小结

Posted 孤独之风。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了林子雨spark scala版编程小结相关的知识,希望对你有一定的参考价值。

dataframe有first()返回第一行数据,使用head(n)返回前n行数据,也可以使用take(n)返回前n行记录

在RDD的行动操作中,用take(n)返回前n个元素,用top(n)逆序返回前n个元素

在dataframe中使用count()输出dataframe对象的行数。

在dataframe中使用distinct()方法返回一个不包含重复记录的Dataframe

在RDD的转换操作中,也是使用distinct()方法进行去重操作

DataFrame的操作

val sqlContext = new org.apache.spark.sql.SQLContext(sc)//初始化SQLContext对象为sqlContext,sqlContext对象是Spark SQL的入口点。
var df = sqlContext.read.format("json").load("D:\\\\Long\\\\Spark\\\\employee.json")//使用json格式创建DataFrame
//1.查询所有的数据
df.show
+----+---+-----+
| age| id| name|
+----+---+-----+
|  36|  1| Ella|
|  29|  2|  Bob|
|  29|  3| Jack|
|  28|  4|  Jim|
|  28|  4|  Jim|
|null|  5|Damon|
|null|  5|Damon|
+----+---+-----+
//2.查询所有的数据,并去除重复的数据
df.distinct().show
+----+---+-----+
| age| id| name|
+----+---+-----+
|  36|  1| Ella|
|  29|  3| Jack|
|null|  5|Damon|
|  29|  2|  Bob|
|  28|  4|  Jim|
+----+---+-----+
//2.查询所有的数据,打印时去除id字段
df.select("age","name").show
+----+-----+
| age| name|
+----+-----+
|  36| Ella|
|  29|  Bob|
|  29| Jack|
|  28|  Jim|
|  28|  Jim|
|null|Damon|
|null|Damon|
+----+-----+
//或者使用 df.drop("id").show 使用drop一次只能删除一个字段
//3.筛选出age>30的记录
df.where("age>30").show   //注意where里的写法 "age > 30"
+---+---+-----+
|age| id| name|
+---+---+-----+
| 36|  1| Ella|
+---+---+-----+
//4.将数据按age分组
df.groupBy("age").count.show
+----+-----+
| age|count|
+----+-----+
|  29|    2|
|null|    2|
|  28|    2|
|  36|    1|
+----+-----+
//5.将数据按name升序排列
 df.sort("name").show
+----+---+-----+
| age| id| name|
+----+---+-----+
|  36|  1| Ella|
|  29|  2|  Bob|
|null|  5|Damon|
|null|  5|Damon|
|  29|  3| Jack|
|  28|  4|  Jim|
|  28|  4|  Jim|
+----+---+-----+
//6.取出前3行数据
df.take(3)//take返回的是前若干行数据的数组
Array[org.apache.spark.sql.Row] = Array([36,1, Ella], [29,2,Bob], [29,3,Jack])
df.limit(3).show//而使用limit是返回前若干行数组组成的Dateframe对象,可以用show方法进行查看
+---+---+-----+
|age| id| name|
+---+---+-----+
| 36|  1| Ella|
| 29|  2|  Bob|
| 29|  3| Jack|
+---+---+-----+
//7.查询所有记录的name列,并为其取别名为username
df.select(df("name").as("username")).show //这里必须df(...).as
+--------+
|username|
+--------+
|    Ella|
|     Bob|
|    Jack|
|     Jim|
|     Jim|
|   Damon|
|   Damon|
+--------+
//8.查询年龄age的平均值
 df.agg(avg("age")).show   //使用mean也是等价的df.agg(mean("age")).show
+--------+
|avg(age)|
+--------+
|    30.0|
+--------+
//9.查询年龄age的最小值
 df.agg(min("age")).show
+--------+
|min(age)|
+--------+
|      28|
+--------+


RDD操作
数据集

Aaron,OperatingSystem,100
Aaron,Python,50
Aaron,ComputerNetwork,30
....
共1000+数据
  1. 该系总共有多少学生

    var rdd = sc.textFile("D:\\\\Long\\\\Spark\\\\chat4.txt")//使用文本文件创建RDD
    var per = rdd.map(x => (x.split(",")(0)))//数组0下标表示的是姓名
    per.distinct().count()//distinct是转换操作,目的是为了去重,count是行动操作,会直接统计元素的个数并输出
    ——————————————————————————————————————————
    var tem = rdd.maprow => var splits = row.split(",");(splits(0),splits(1),splits(2).toInt)
    tem.map(x => x._1).distinct().count
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4hvzEt8-1656335295914)(C:/Users/dell/AppData/Roaming/Typora/typora-user-images/image-20220625171550352.png)]

  2. 该系共开设了多少门课程

    var per = rdd.map(x => (x.split(",")(1)))//下标1是课程名
    per.distinct().count()
    ——————————————————————————————————————————
    tem.map(x => x._1).distinct().count
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zOeKimyI-1656335295916)(C:/Users/dell/AppData/Roaming/Typora/typora-user-images/image-20220625171756016.png)]

  3. Tom 同学的总成绩平均分是多少

    name.map(row => (row.split(",")(0),row.split(",")(2).toInt)).mapValues(x => (x,1)).reduceByKey((x,y) => (x._1+y._1,x._2+y._2)).mapValues(x => (x._1/x._2)).collect
    ————————————————————————————————————————————
    tem.filter(x => x._1 == "Tom").map(x => (x._1,x._3)).mapValues(x => (x,1)).reduceByKey((x,y) => (x._1+y._1,x._2+y._2)).mapValues(x => x._1/x._2).fore
    ach(println)
    
  4. 求每名同学的选修的课程门数

    rdd.map(row => (row.split(",")(0),row.split(",")(1))).mapValues(x => (x,1)).reduceByKey((x,y) => ("",x._2+y._2)).mapValues(x => x._2).foreach(println)//("",x._2+y._2)前的这个双引号一定要加,不然会报类型匹配错误
    
    ——————————————————————————————————————————————————————————————————————————————————————————————————————————————
    tem.map(x => (x._1,x._2)).mapValues(x => (x,1)).reduceByKey((x,y) => ("",x._2+y._2)).mapValues(x => x._2).foreach(println)
    
  5. 该系 DataBase 课程共有多少人选修

    val total = rdd.filter(row => row.split(",")(1)=="DataBase")
    total.count()
    //total.map(row => (row.split(",")(1),row.split(",")(0))).mapValues(x => (x,1)).reduceByKey((x,y) => ("",x._2+y._2)).mapVules(x =>x._2).foreach(println)
    ——————————————————————————————————————————————————————————————————————————————
    tem.filter(x => x._2 == "DataBase").map(x =>x._1).distinct().count
    
  6. 各门课程的平均分是多少

    rdd.map(row => (row.split(",")(1),row.split(",")(2).toInt)).mapValues(x => (x,1)).reduceByKey((x1,x2) => (x1._1+x2._1,x1._2+x2._2)).mapValues(x => x._1/x._2).foreach(println)
    
    ——————————————————————————————————————————————————————————————————————————————————————————————————
    tem.map(x => (x._2,x._3)).mapValues(x => (x,1)).reduceByKey((x,y) => (x._1+y._1,x._2+y._2)).mapValues(x => x._1/x._2).foreach(println)
    

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ulFvphFY-1656335295916)(C:/Users/dell/AppData/Roaming/Typora/typora-user-images/image-20220625200010181.png)]

  7. 词频统计

var rdd = sc.textFile("D:\\\\Long\\\\Spark\\\\word.txt")
var ree = rdd.flatMap(row => row.split(" "))//这里用flatMap而不是map的原因是因为每一行有很多单词,有很多行。用flatMap就可以将不同的集合合并为一个集合
var ree1 = ree.map(word => (word,1))//这里用map而不是mapValues是因为这里不是键值对形式,所以无法使用mapValues
ree1.reduceByKey((x,y) => x+y).mapValues(x => x).foreach(println)

以上是关于林子雨spark scala版编程小结的主要内容,如果未能解决你的问题,请参考以下文章

学习进度12

学习进度15

参考大数据厦门大学林子雨编著的《大数据技术原理与应用(第3版)》中第三课《HDFS编程实践(Hadoop3.1.3)》遇到的bug

大数据技术原理与应用 第三版 林子雨 期末复习大数据概述 第一章 P2

厦门大学林子雨开设的《大数据技术原理与应用》第七章 MapReduce

编程实现利用 DataFrame 读写 MySQL 的数据