一、spark sql概述:
1.了解官网相关内容
sql概述
sparksql编程数据结构(dataframe , dataset )
SparkSession
sparksql基本操作(api使用说明)
Global Temporary View
RDD如何转换(dataframe , dataset )
udf / udaf (Hive函数)
Data Sources sql数据源来自哪里,数据处理之后能够放到哪里
Parquet Files 数据存储格式
SparkSql如何来整合mysql | (sqoop)【spark—>sqoop退出舞台了】
版本说明
2.sparksql是spark生态栈中的一个模块
(1)RDD取代MR(函数式编程、编码)
DataFrame/DataSet(sql的编程风格取代hive hql)【MR】
hive(计算、存储);spark on hive【hive制作存储不做计算】
(2)spark sql底层是翻译成SparkRDD(尽量基于内存计算),只能处理结构化的数据
MR做数据清洗,为什么不用hive做数据清洗;RDD做数据清洗(数据分析:sparksql)
说明:SparkCore(RDD)把日志非结构化格式数据处理成结构化。数据存储到hive之后使用sparksql对hive中存储的数据做各种数据分析
补充:外部常见的数据源有json、parquet(列式存储)、RDBMS(关系型数据库)、hive
3.为什么要学习sparksql
(1)sparksql易于整合
flume(数据采集------老版本源和目标要相同,新版和spark能解耦)
源 — 缓存 — 目标
源 — 目标
SparkSql [数据源可以来自任意的地方、目标也可以是任意的地方](解耦)
(2)统一的访问方式
spark.read(“json / .parquet”)
(3)兼容hive
(4)兼容mysql
4.sparksql的版本迭代
-
1.SparkSql的前身Shark[2014停止维护了、Spark 2014-09]【1.x】
-
2.spark1.3(dataframe)
-
3.spark1.4(窗口函数)
-
4.spark1.5对hive支持了(udf、udaf)
-
5.spark1.6.3【注释 --】 | Spark2.2.0
-
6.spark2.x系列
二、程序实现
sparksql的基本操作:
补充说明: SparkSql —》 DataFrame不会做编译期间的检查(对Sql/字段)
配置文件相同;程序入口不同(sparkRDD:SparkContext)
案例一:老版本的写法
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[1]").setAppName("sparksql")
val sc: SparkContext = new SparkContext(conf)//RDD程序入口
//缺少sparksql程序的入口
val sqlContext: SQLContext = new SQLContext(sc)
val frame: DataFrame = sqlContext.read.json("C:\\Users\\Administrator\\Desktop\\javaclass\\spark\\09_07_sql\\people.json")
frame.show()
sc.stop()
}
SparkSql基本操作:
配置文件:一样
程序的入口:不一样
SparkRDD : SparkContext
SparkSql : SQLContext
: HiveContext
Spark2.x后面:SparkSession(统一了程序的访问入口)
案例二:新版本写法
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder().appName("sparksql2")
.master(master = "local[1]")
// .enableHiveSupport()
.getOrCreate()
// spark.sparkContext//RDD
// spark.sqlContext//sparksql
val frame: DataFrame = spark.read.json("C:\\Users\\Administrator\\Desktop\\javaclass\\spark\\09_07_sql\\people.json")
frame.show()
spark.stop()
}
构建者设计模式和new的不同之处:
new构建对象()存在对象,给对象的属性进行赋值
构建者先把一个对象构建之后应该有的信息全部进行说明,最后构建对象
案例三:sparksql基本操作
SparkSql —》 DataFrame不会做编译期间的检查(对Sql/字段)
def main(args: Array[String]): Unit = {
//1.控制日志打印级别
Logger.getLogger("org.apache.hadoop").setLevel(Level.WARN)
Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
Logger.getLogger("org.spark-project").setLevel(Level.WARN)
//2.构建程序的入口
val spark = SparkSession.builder().appName("sparksql2")
.master(master = "local[1]")
.getOrCreate()
//3.获取数据
val df: DataFrame = spark.read.json("C:\\Users\\Administrator\\Desktop\\javaclass\\spark\\09_07_sql\\people.json")
/**打印Schema信息
*/
//df.printSchema()
//df.show() //默认20条
/**简单的查询: select name,age from t_name
* spark core:读取文本--》map(切分、返回二元组)
*/
val df1: DataFrame = df.select(new Column("name"), new Column("age"))
val df2: DataFrame = df.select("name","age")
//df1.show()
//df2.show()
/**条件的查询: select * from t_name where age > 19
* spark core:读取文本--》map((age,height,name))-->filter(age>19 false <19 true).foreach
*/
// val df3: DataFrame = df.select( //age只会输出true、false
// new Column("name"), new Column("height")
// , new Column("age").>(19).as("age19")
// )
// df3.show()
val df4: DataFrame = df.select( //可以实现
new Column("name"), new