第1关:DataSet创建
知识点
1.强类型DataSet创建
(1)使用基本类型的序列创建DataSet
## 创建集合
val seq = Seq(1,2,3,4)
## 调用toDS()方法
val ds: Dataset[Int] = seq.toDS()
ds.show()
(2)使用样例类序列创建DataSet(样例类不能位于main方法中否则编译无法通过)
## 创建样例类User
case class User(id:Int,name:String,age:Int)
## 调用toDS()方法
val ds1: Dataset[User] = Seq(User(202201,"Anne",20)).toDS()
ds1.show()
(3)RDD转换为DataSet
## 创建样例类
case class User(id:Int,name:String,age:Int)
## 调用toDS()方法
val ds2: Dataset[User] = sc.makeRDD(List((202201, "Anne", 20), (202202, "Jack", 21)))
.map(t => User(t._1, t._2, t._3)).toDS()
ds2.show()
(4)DataFrame转换为DataSet
## 创建样例类User
case class User(id:Int,name:String,age:Int)
## 创建RDD调用toDF()方法
val df: DataFrame = sc.makeRDD(List((202203, "Anna", 22), (202204, "Peter", 24))).toDF("id","name","age")
## 调用as[]方法
val ds3: Dataset[User] = df.as[User]
ds3.show()
编程要求
-
使用基本类型 String 创建 DataSet
-
使用样例类 Staff 创建 DataSet
-
将 RDD 转换为 Staff 类型的 DataSet
-
将 DataFrame 转换为 Staff 类型的 DataSet
-
读取
/root/depart.csv
文件创建 DataSet -
数据切分方式:逗号(
,
)数据所在目录:
/root/depart.csv
depart
表结构:
INFO | TYPE |
---|---|
depart_id | int |
depart_name | string |
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext, sql}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
object first {
def main(args: Array[String]): Unit = {
// TODO 创建SparkSQL的运行环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("sparkSQL")
val sc = new SparkContext(sparkConf)
val spark =SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
/********* Begin *********/
// 使用基本类型 String 创建 DataSet,并打印输出
val seq = Seq("hello","spark")
///调用toDS()方法
val ds:Dataset[String]=seq.toDS()
ds.show()
// 使用样例类 Staff 创建 DataSet,并打印输出
val seq1 = Seq(Staff(1011,"JayChou","male"))
val ds1:Dataset[Staff]=seq1.toDS()
ds1.show()
// 将RDD转换为Staff类型的DataSet,并打印输出
val rdd1: RDD[(Int, String, String)] = sc.makeRDD(List((1012, "Eason", "male")))
val ds2:Dataset[Staff]=rdd1.map(t=>Staff(t._1,t._2,t._3)).toDS()
ds2.show()
// 将DataFrame转换为Staff类型的DataSet,并打印输出
val rdd2: RDD[(Int, String, String)] = sc.makeRDD(List((1013, "MJ", "female")))
val ds3: DataFrame = rdd2.toDF("id","name","sex")
ds3.show()
// 读取'/root/depart.csv'文件创建Dataset,保留表头,并打印输出
val ds4:Dataset[Row]=spark.read.format("csv").option("seq",",").option("header","true").load("/root/depart.csv")
ds4.show()
/********* End *********/
// TODO 关闭环境
spark.close()
sc.stop()
}
case class User(id:Int,name:String,age:Int)
case class Staff(id:Int,name:String,sex:String)
}
第2关:无类型的DataSet操作
知识点
1.选择类型的操作
(1)select:用于选择需要获取的列;
(2)selectExpr:可直接使用SQL函数进行查询,等效于同时使用select配合expr函数;
(3)withColumn:用于创建一个新的列或者修改原来的列;
(4)withColumnRenamed:用于修改列名。
2.剪切类型的操作
(1)drop:用来减掉或删除某个列。
3.聚合类型的操作
(1)groupBy:用来指定某行进行分组操作。
编程要求
-
读取
/root/dept.csv
文件创建DataSet
-
查询
name
列数据 -
查询
staff
表平均年龄 -
修改原来的
id
列为staff_id
-
将
name
列修改为staffName
-
删除
age
列 -
按
depart_name
分组统计不同部门的人数 -
数据切分方式:逗号(
,
)数据所在目录:
/root/staff.csv
staff
表结构:
INFO | TYPE |
---|---|
id | int |
name | string |
age | int |
depart_name | string |
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext, sql}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
object second {
def main(args: Array[String]): Unit = {
// TODO 创建SparkSQL的运行环境
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("sparkSQL")
val sc = new SparkContext(sparkConf)
val spark =SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
/********* Begin *********/
//case class User(id:Int,name:String,age:Int,depart_name:String)
// 读取'/root/dept.csv'文件创建DataSet
val df:DataFrame=spark.read.format("csv").option("seq",",").option("header","true").load("/root/staff.csv")
//df.show()
// 查询'name'列数据
df.select("name").show()
// 查询平均年龄
df.selectExpr("avg(age)").show()
// 修改原来的'id'列为'staff_id'
df.withColumn("staff_id",'id).show()
// 将'name'列修改为'staffName'
df.withColumnRenamed("name","staffName").show()
// 删除'age'列
df.drop("age").show()
// 按'depart_name'分组统计不同部门的人数
df.groupBy("depart_name").count().show()
/********* End *********/
// TODO 关闭环境
spark.close()
sc.stop()
}
}