知识点
1.DataFrame
与 RDD 的主要区别在于,前者带有 schema 元信息,即 DataFrame
所表示的二维表数据集的每一列都带有名称和类型,从而对藏于 DataFrame
背后的数据源以及作用于 DataFrame
之上的变换进行了针对性的优化,最终达到大幅提升运行时效率的目标。反观 RDD,由于无从得知所存数据元素的具体内部结构,Spark Core 只能在 stage 层面进行简单、通用的流水线优化。
2.从Spark数据源进行创建
(1)读取CSV文件创建DataFrame
## 读取staff.csv文件创建DataFrame对象
val df: DataFrame = spark.read.format("csv") ##指定加载的数据类型
.option("sep", ";") ##指定分割符
.option("header","true") ##获取头部信息
.load("/root/staff.csv") ##加载数据的路径
## 调用show方法查看数据
df.show()
(2)读取JSON文件创建DataFrame
## 读取user.json文件创建DataFrame对象
val df: DataFrame = spark.read.json("/root/user.json")
## 调用show方法查看数据
df.show()
3.从RDD进行转换
调用RDD中的toDF方法转换为DataFrame对象,由于RDD与DataFrame转换需要引入隐式转换规则,否则无法进行转换。
## spark不是包名,是上下文环境对象名
import spark.implicits._
## 创建RDD对象
val rdd: RDD[(Int, String, Int)] = spark.sparkContext.makeRDD(List((1, "ww", 20), (2, "ss", 30), (3, "xx", 40)))
## 通过toDF方法将RDD转为DataFrame
val df: DataFrame = rdd.toDF("id", "name", "age")
## 调用show方法查看数据
df.show()
4.SQl语法
(1)创建临时视图
## 读取JSON文件创建DataFrame对象
val df: DataFrame = spark.read.json("/root/user.json")
## 对DataFrame对象创建一个临时视图
df.createOrReplaceTempView("user")
## 通过SQL语句实现表查询
spark.sql("select * from user").show()
spark.sql("select avg(age) from user").show()
(2)创建全局视图
## 读取JSON文件创建DataFrame对象
val df: DataFrame = spark.read.json("/root/user.json")
## 对DataFrame对象创建一个全局表
df.createGlobalTempView("people")
## 通过SQL语句实现表查询
spark.sql("select username from global_temp.people").show()
## 创建新的Session会话,在该Session中进行查询
spark.newSession().sql("SELECT * FROM global_temp.people").show()
5.DSL语法:涉及到运算的时候, 每列都必须使用$, 或者采用引号表达式:单引号+字段名
## 读取JSON文件创建DataFrame对象
val df: DataFrame = spark.read.json("/root/user.json")
## 通过DSL语句实现表查询
df.select("age","username").show()
df.select($"age"+1).show()
df.select('age+1).show()
编程要求
-
读取csv文件创建DataFrame:
/root/student.csv
-
创建临时视图
student
,通过SQL
语法查询name
列数据 -
通过
DSL
语法查看name
列数据以及id+1
数据 -
调用
toDF()
方法转换rdd并查看数据 -
数据切分方式:逗号(
,
)数据所在目录:
/root/student.csv
student
表结构:
INFO | TYPE |
---|---|
id | int |
name | string |
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, sql}
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
object sparkSQL_dateFrame {
def main(args: Array[String]): Unit = {
//创建上下文环境配置对象
val sparkConf = new SparkConf().setMaster("local[*]").setAppName("sparkSQL")
//创建SparkSession对象
val spark =SparkSession.builder().config(sparkConf).getOrCreate()
import spark.implicits._
//创建RDD对象
val rdd = spark.sparkContext.makeRDD(List(("Anne","male"),("小敏","male"),("冰墩墩","female")))
/********* Begin *********/
//指定加载的数据类型、分割符,获取头部信息,加载数据路径
val df:DataFrame=spark.read.format("csv").option("sep",",").option("header","true").load("/root/student.csv")
//df.show()
df.createOrReplaceTempView("student") //创建临时视图
spark.sql("select name from student").show()
df.select(df("name"), df("id") + 1).show()
// 调用toDF()方法转换rdd并查看数据
val dfFromRdd = rdd.toDF("name","sex")
dfFromRdd.show()
/********* End *********/
// TODO 关闭环境
spark.close()
}
}