SparkSQL

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()
  }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值