SQL(Structured Query Lanaguage 结构化查询语言)
是一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存储数据以及查询、更新和管理关系数据库系统;同时也是数据库脚本文件的扩展名。
常用的SQL框架(Hive、Impala、Presto、Shark、Drill、Phoenix等等)
RDD、DataFrame和DataSet之间的区别
DataFrame是Spark 1.3.0版本提出,Spark 1.6.0版本又引出DataSet,在Spark 2.0版本中,DataFrame和DataSet合并为DateSet。DataFrame和DataSet是基于RDDs的,而且三者之间可以通过简单的API调用进行无缝切换。
RDD缺点:对于结构化数据处理麻烦,默认采用Java的序列化方式,序列化结构比较大,而且数据存储在Java内存中,导致GC比较频繁
DataFrame的优点:
1、结构化数据处理非常方便,支持JSON,CSV等key/value数据,也支持Hive,MySQL等传统数据库表
2、有针对性的优化,如采用Kryo序列化,由于数据结构元数据信息spark已经保存,不序列化不需要带上元信息,大大减少了序列化大小,而且数据保存在堆外内存中,减少了GC次数,运行更快
(堆内内存:JVM中的内存,可通过Xms,-Xmx等参数设置;堆外内存:操作系统的内存)
3、hive兼容,支持HQL,UDF
DataSet:
1、DataSet整合了RDD和DataFrame的有点,支持结构化和非结构化的数据
2、和RDD一样,支持自定义对象的存储
3、和DataFrame一样,支持结构化数据的SQL查询
4、采用堆外内存,GC友好
DataFrame操作JSON格式数据
package SparkSQL
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
object SQL_12_30 {
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkSQL").setMaster("local")
val sc = new SparkContext(conf)
val sql = new SQLContext(sc)
/*数据格式
{"name":"tom","age":15,"sex":"male"}
{"name":"jack","age":19,"sex":"male"}
{"name":"jerry","age":12,"sex":"male"}
{"name":"amy","age":14,"sex":"female"}
*/
val data = sql.read.json("G://json.txt")
//方法一,data对象直接对json中key值查询
data.select("name","age").filter(data("age")>15).show()
//方法二,注册临时表,sql对象使用SQL查询
data.registerTempTable("people")
sql.sql("select * from people where age>16").show()
sc.stop()
}
}
DataFrame操作普通格式数据
SparkSQL中有两种方式可以在DataFrame和RDD进行转化,第一种是利用反射机制,对已知类型的RDD,通过反射将其转换为指定类型的DataFrame。第二种通过接口编程与RDD进行交互获取Schema,并动态创建DataFrame,在运行时决定列及类型
package SparkSQL
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
object SQL_12_30 {
//乳品生鲜::湾仔码头 上汤小云吞 三鲜口味 600g::xxx自营旗舰店::29.80::36万+::好评率99%
case class shopping(shop_type:String,shop_title:String,name:String,price:String,evalute:String,praise:String)
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("SparkSQL").setMaster("local")
val sc = new SparkContext(conf)
val sql = new SQLContext(sc)
import sql.implicits._
//将RDD转成DataFrame
val data = sc.textFile("G://stores.txt").map(x=>{
val values = x.split("::")
(values(0),values(1),values(2),values(3),values(4),values(5))
}).map(x=>new shopping(x._1,x._2,x._3,x._4,x._5,x._6)).toDF()
//注册临时表
data.registerTempTable("shop")
//使用SQL操作数据
sql.sql("select count(*) as count from shop").show()
//将DataFrame转换为RDD
data.map(x=>x).take(10).foreach(println)
sc.stop()
}
}