无类型的DataSet创建与使用

第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表结构:

INFOTYPE
depart_idint
depart_namestring
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表结构:

INFOTYPE
idint
namestring
ageint
depart_namestring
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()

  }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值