spark sql 应用实例笔记 -- (视频笔记)
spark sql 应用实例随笔
//define the schema using a case class
//必须为case class,否则无法隐式转换
case class Person(name:String, age: Int)
//create an RDD of Person objects and register it as a table
//people 为schema RDD
val people=sc.textFile("path").map(_.split(",")).map(p=>Person(p(0),p(1).trim.toInt))
//注册为内存表
people.registerAsTable("people")
//sql statements are run with the sql method from sqlContext
//sql 支持join操作
val teenagers = sql("select name from peopel where age >= 13 and age <= 19")
//the results of SQL queries are SchemaRDDs but alos support normal RDD operatations
//the columns of a row in the result are acessed by ordinal
val nameList = teenagers.map(t=>"Name: " + t(0)).collect()
//querying using the Scala DSL(领域语言)
//express queries using functions,instead of SQL string
//the follow is the same as sql
//spark 下个版本的DSL预计支持如下
val teenagers1 = people.where('age >= 13)
.where('age <= 19)
.select('name)
//spark sql can cache tables using an in-memory columnar format:
//shark 也有缓存表,数据是按列存放的,按列存放;查询快,方便投影,少IO,便与压缩。把整个一列最为一个对象,对象少了很多,同理HBase。列存储的原理和优势
//scan only required columns
//fewer allocated objects(less GC)
//Automatically selects best compression
//数据被频繁使用则把表缓存
cacheTable("people")
//Parquet compatibility
//重要的数据格式。
//也是列是存储
//impala支持
//极好的压缩比例,极好的GC,极好IO
//如果打算把数据固化,把数据作为parquet文件。
//native support for reading data in parquet
//任何SchemaRdd都可以转化为parquet
people.saveAsParquetFile("people.parquet")
//比磁盘缓存更好的一种缓存方式,介于磁盘和内存之间。
val parquetFile = sqlContext.parquetFile("people.parquet")
//parquetFile也是一种SchemaRDD
//parquet内有自身schema信息
parquetFile.registerAsTable("parqueFile")
val teenagers2 = sql("select name from parqueFile where age >=13 and age <= 19")
//hive 兼容性
1、通过RDD直接操作hive的数据。
2、1.1版本有hive on spark
3、1.0和1.0.1是hive in spark(不支持client直接执行sql)
4、
support for writing queries in HQL;
catalog into from hive metastore;
tablescan operate that uses hive serdes;
wrappers for hive udfs,udafs,udtfs.
spark sql现在版本不支持udf
hive in spark sql 是支持udf的。
shark 支持udf
5、
val hiveContext = new org.apache.spark.sql.hive.HiveContext(sc)
import hiveContext._
hql("create table if not exists sc (key int,value string)")
hql(load data local inpath '/path' into table src)
hql("from src select key,vale")
spark sql 与 hive on spark
shark 不会将任务翻译为MR
hive on spark会翻译为MR,将MR转为RDD算子运行。
catalyst(将sql解析为实际可执行RDD,其中包含将sql解析为语法树)
spark sql core
hive support,通过RDD操作MR
spark streaming
spark 可以使用(hdfs、parquet、json;hbase、cassandra、mongoDB;sap(热点)、oracle)
shark ==>>>> spark sql
hive on spark
spark jdbc 当前是spark sql的驱动
函数式编程最基本的原则,是不产生负作用,不改变原有值。
RDD union时,取两个schemaRDD 然后合并赋值 第三个,而不要将第二个插入到第一个里面造成第一的改变。
sql or hql
-> sql parser 生成unresolveed logical plan
-> analyzer生成 analized logicalplan
-> optimizer optimized logical plan
--------------- 以下为spark core 执行部分--------------
-> spark planer(use stretage to plan)生成physical plan
-> call next 函数生成 spark plan
-> spark plan(prepare) prepared spark plan
-> call toRDD 执行sql生成RDD