Spark SQL概念与 Dataset和DataFrame的创建

概述:

SQL:结构化查询语言

Spark SQL是用于结构化数据处理的Spark模块(批/流处理),根据应用中数据类型和转换处理进行自动程序优化。

Datasets and DataFrames

Spark SQL中的两个非常重要的操作对象。

Dataset
数据集对象,代表是一个分布式数据集合,类似于功能增强RDD(强大函数和执行优化),Dataset可以通过JVM对象和函数转换操作获得,支持Java和Scala两种语言,目前不支持Python语言。

DataFrame
数据帧对象,对象是一个特殊的Dataset[Row],等价于关系型数据库中的表的概念。
可以从多种来源构造DataFrame。(结构化数据文件,HIbe中的表,外部数据库或现有RDD)

总结:
增强版本的RDD–> Dataset
DataFrame -> 特殊的Dataset

需要用到的依赖

 <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.4.4</version>
  </dependency>
  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.4.4</version>
  </dependency>
开发应用

SQL语句实现(常用)

object SparkSQLExample {
   def main(args: Array[String]): Unit = {
    //1.创建Spark sql 应用环境对象Spark Session
    val spark = SparkSession.builder().appName("quick example").master("local[*]").getOrCreate()

    //2.构建数据源对象 Dataset 和DataFrame
    //RDD --> Dataset
    //导入外部的隐式转换
    import  spark.implicits._

    val dataset = spark.sparkContext.makeRDD(List((1, "zs", "男"), (2, "ls", "女"), (3, "ww", "男"))).toDS()

    //3.数据处理
    //统计男性和女性的人数
    //SQL:select  sex,count(id) from t_user group by sex

    //给数据集对象创建视图名(表名)
    dataset.createTempView("t_user")

    spark
      .sql("select _3 as sex,count(_1) as num from t_user group by _3") //自动翻译成Spark应用
      .show()   //展示表中内容

    //4.释放资源
    spark.stop()

  }
}

方法实现

object SparkSQLExample02 {
  def main(args: Array[String]): Unit = {
  	//创建Spark SQL应用运行环境对象Spark Session
  	val spark = SparkSession.builder().appName("spark example").master("local[*]").getOrCreate()

	//构建数据源对象 Dataset 和DataFrame
	//RDD --> Dataset
	//导入外部的隐式转换
	import spark.implicits._
	val dataFrame = spark.sparkContext.makeRDD(List((1,"zs","男"), (2, "ls", "女"), (3, "ww", "男"))).toDF 

	//数据处理
	//统计男性和女性用户的人数
	dateFrame
	//分组方法
		.groupByKey(row => row.getString(2))
		.count()  //男 2  女  1
		.show()

	//释放资源
	spark.stop()
    }
}

Dataset和DataFrame创建

非常相似,可以通过RDD隐式转换创建,转换函数等

RDD转换创建

Dataset
//导入外部隐式转换
import spark.implicits._

//通过元祖
val dataset = spark.sparkContext.makeRDD(List((1, "zs", "男"), (2, "ls", "女"), (3, "ww", "男"))).toDS

//通过样例类
val rdd = spark.sparkContext.makeRDD(List(Student(1, "zs", true), Student(2, "ls", false)))
val dataset =rdd.toDS

//外部数据源 : json
val dataFrame = spark.read.json("D:\workspace\hadoop\Spark-review\src\main\resources")  
//resources目录下已有json文件

import spark.implicits._

//df转换为ds
val dataset = dataFrame.as[User]

dataset.show()

DataFrame
import spark.implicits._
val dataFrame = spark.sparkCOntext.makeRDD(List((1, "zs", "男"), (2, "ls", "女"), (3, "ww", "男"))).toDF()

//通过样例类
val rdd =spark.sparkContext.makeRDD(List((1, "zs", true), Student(2, "ls", false)))

//外部数据源  json
val dataFrame = spark.read.json("D:\workspace\hadoop\Spark-review\src\main\resources")
dataFrame.show()

//DataFrame <==> RDD[Row] +Schema

val rdd =spark.sparkContext.textFile("")

val rowsRDD = rdd
.map(line = >{
	val arr = line.split(" ")
	Row(arr(0).toInt,arr(1),arr(2).toInt,arr(3).toBoolean)
})
import spark.implicits._

//结构表约束(结构)对象
val schema = new StuctType()
	.add("id",IntegerType)
	.add("username",StringType)
	.add("age",IntegerType)
	.add("sex",BooleanType)

val dataFrame =spark.createDataFrame(rowsRDD,schema)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值