sparksql:
Spark SQL是Spark处理数据的一个模块
专门用来处理结构化数据的模块,像json,parquet,avro,csv,普通表格数据等均可。
与基础RDD的API不同,Spark SQL中提供的接口将提供给更多关于结构化数据和计算的信息,并针对这些信息,进行额外的处理优化
操作方式说明:
SparkSql shell:
类似于hive shell
DataFrames API:
最早专为sql on spark设计的数据抽象,与RDD相似,增加了数据结构scheme描述信息部分。
写spark代码,面向DF(DataFrams缩写)编程,可以与其它Spark应用代码无缝集成。
比RDD更丰富的算子,更有利于提升执行效率、减少数据读取、执行计划优化。
DataSets API:
集成了RDD强类型和DataFrames结构化的优点,官方正强力打造的新数据抽象类型。
写spark代码,面向DS编程,可以与其它Spark应用代码无缝集成。
比RDD更丰富的算子,更有利于提升执行效率、减少数据读取、执行计划优化。
面向程序接口对接的操作:通过JDBC、ODBC等方式操作SparkSql
通过jdbc、odbc链接后,发送相关的sparksql请求,实现基于sparksql功能开发。
SparkSQl特点:
可以利用SQL、DataFrams API、DataSets API或其它语言调用的基于sparksql模块计算,均是sparkcore执行引擎,其对计算的表达是独立的,即开发人员可以轻松在不同API之间切换实现相同的功能。
也可以通过命令行、JDBC、ODBC的方式来操作SparkSQL,方便其它数据平台、BI平台使用SparkSql模块。
在spark应用程序开发中,可以无缝使用SparkSql操作数据。
可以直接使用Hive表格数据。
与Hive的兼容性极好:它复用了Hive的前端(去掉驱动mapreduce执行任务的部分)和元数据,因此可以拿过来hivesql的东西在sparksql上运行即可。
并不是100%完全兼容,但绝大多数情况下,不需要改动,或只需要极小的改动!!!
比如个别版本不支持直接insert into table xxx values(xxx...)的插入数据的方式
SparkSql的应用中,sql是一个重要方面,但不局限制sql。
sparksql操作代码:
//直接输入spark-sql+自己想要添加的参数即可,与spark-shell相似
spark-sql [options]
//如指定运行模式
spark-sql local[*]
//如指定运行spark webui服务的端口,解决多人共用一个入口机时候的进入时候报port bind exception的问题
spark-sql --conf spark.ui.port=4075
//也可以用于似于hive -e的方式,直接直接一段sparksql代码
spark-sql –e “sparksql code”
与之前的Sbt构建SparkWordCount步骤完全一样。
1.6版本
package com.tl.job003.sql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
object SparkSqlTest {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setMaster("local");
conf.setAppName("TestSparkSql");
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// 添加将RDD转化为DataFrame的功能包引入
import sqlContext.implicits._
val df = sqlContext.read.json("file:\\E:\\test\\job003\\sparksql\\input_weibo.json")
df.show();
sc.stop();
}
}
常用操作:
package com.tl.job003.sql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
object SparkSqlTest {
def main(args: Array[String]) {
val conf = new SparkConf()
conf.setMaster("local");
conf.setAppName("TestSparkSql");
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// 添加将RDD转化为DataFrame的功能包引入
import sqlContext.implicits._
val df = sqlContext.read.json("file:\\E:\\test\\job003\\sparksql\\input_weibo.json")
//默认显示内容的top20
df.show()
// 打印内容对应的表结构
df.printSchema()
// 选择内容当中的某一个列对应的内容
df.select("content").show()
// 选择任意列并进行自定义操作
df.select(df("content"), df("commentCount"), df("commentCount") + 10000).show()
// 选择评论数大于100的数据显示出来
df.filter(df("commentCount") > 100).show()
// 按userId进行分组计数统计
df.groupBy("userId").count().show()
//分组统计结果按默认升序排列
df.groupBy("userId").count().orderBy("count").show()
//分组统计结果按降序排列
import org.apache.spark.sql.functions._
df.groupBy("userId").count().orderBy(desc("count")).show()
sc.stop();
}
}
2.3版本:
package com.tl.job011.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SparkSession
object TestSparkSqlFor2_3_x {
def main(args: Array[String]): Unit = {
//1、构建spark session
val sparkSession = SparkSession
.builder()
.appName("SparkSql-2.3.2-TestCase")
.master("local[*]")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import sparkSession.implicits._
//2、构建data frames
val df = sparkSession.read.json("F:\\test_sbt\\FirstSpark4Scala\\input_json.txt")
//3、df算子操作
// 打印内容对应的表结构
df.printSchema()
// 选择内容当中的某一个列对应的内容
df.select("content").show()
// 选择任意列并进行自定义操作
df.select(df("content"), df("commentCount"), df("commentCount") + 10000).show()
// 选择评论数大于100的数据显示出来
df.filter(df("commentCount") > 100).show()
// 按userId进行分组计数统计
df.groupBy("userId").count().show()
//分组统计结果按默认升序排列
df.groupBy("userId").count().orderBy("count").show()
//分组统计结果按降序排列
import org.apache.spark.sql.functions._
df.groupBy("userId").count().orderBy(desc("count")).show()
//4、停掉相关会话
sparkSession.stop()
}
}
//提供直接转化成RDD的方式,即df.rdd即可
studentDataFrame.rdd
SparkSql临时表生成(内存中存放的表,应用结束即消失):
df.registerTempTable("weibo_doc"); //1.6.x版本
df. createTempView ("weibo_doc"); //2.3.x版本
DataFrame数据持久化:
parquet:
数据格式,默认的输入和输出均为该格式
优点:
package com.tl.job011.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.types.StructField
import org.apache.spark.sql.types.StringType
import org.apache.spark.sql.Row
object TestSparksqlPersistFor2_3_x {
def main(args: Array[String]): Unit = {
//1、构建spark session
val sparksql = SparkSession
.builder()
.appName("SparkSql-2.3.2-TestCase")
.master("local[*]")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import sparksql.implicits._
//2、构建scheme
val df = sparksql.read.json("F:\\test_sbt\\FirstSpark4Scala\\input_json.txt")
//3、注册成表
df.createTempView("weibo")
//4、df算子操作
var resultDF = sparksql.sql("select * from weibo")
resultDF.repartition(1).write.format("parquet").save("F:\\test_sbt\\FirstSpark4Scala\\save3")
//5、停掉相关会话
sparksql.stop()
}
}
应用:
package com.tl.job011.sparksql
import org.apache.spark.sql.SparkSession
//样例类
case class Student(name: String, age: Long, address: String)
/**
* 抽象数据类型DataSet测试类
*/
object TestSparkSqlDataSet {
def main(args: Array[String]): Unit = {
//1、构建spark session
val sparkSession = SparkSession
.builder()
.appName("SparkSql-2.3.2-TestCase")
.master("local[*]")
.getOrCreate()
//引入自动隐式类型转换
import sparkSession.implicits._
// 从基础数据对象类型创建DataSet
val primitiveDS = Seq(1, 2, 3).toDS()
val col = primitiveDS.map(_ + 1).collect() // Returns: Array(2, 3, 4)
col.foreach(println)
println("-----------------")
primitiveDS.show()
// 已为样例类case class创建完成编码类Encoder
val caseClassDS = Seq(Student("脱口秀大会", 3, "北京")).toDS()
caseClassDS.show()
// 指定相应的文件导入形成样例类对应的DataSet,通过json的key和样例类的字段名称对应即可
val path = "F:\\test_sbt\\FirstSpark4Scala\\student_data.txt"
val peopleDS = sparkSession.read.json(path).as[Student]
peopleDS.select("name", "age", "address").show()
//关停会话上下文
sparkSession.stop()
}
}
hive与spark sql区别
hive是分布式又是数据仓库,同时又是查询引擎,Spark SQL只是取代的HIVE的查询引擎这一部分,企业一般使用Hive+spark SQL进行开发