Spark SQL在Spark内核基础上提供了对结构化数据的处理,在Spark1.3版本中,Spark SQL不只能够做为分布式的SQL查询引擎,还引入了新的DataFrame编程模型。html
在Spark1.3版本中,Spark SQL再也不是Alpha版本,除了提供更好的SQL标准兼容以外,还引进了新的组件DataFrame。同时,Spark SQL数据源API也实现了与新组件DataFrame的交互,容许用户直接经过Hive表、Parquet文件以及一些其余数据源生成DataFrame。用户能够在同一个数据集上混合使用SQL和DataFrame操做符。新版本还提供了从JDBC读写表的能力,能够更原生地支持Postgres、MySQL及其余RDBMS系统。sql
Spark SQL全部功能的入口点是SQLContext,或它的一个子类。只须要一个SparkContext实例就能够构建一个基本的SQLContext。shell
package cn.spark.study.sql数据库
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
import org.apache.spark.sql.SQLContextapache
/**
* @author Administrator
*/
object DataFrameCreate {
def main(args: Array[String]) {
val conf = new SparkConf()
.setAppName("DataFrameCreate")
.setMaster("local");
val sc = new SparkContext(conf)
val sqlContext = new SQLContext(sc)
// val df = sqlContext.read.json("hdfs://spark1:9000/students.json")//从hdfs
// val df = sqlContext.read.json("./data/people.json")
val df = sqlContext.read.json("./data/aa.json")
//Spark DataFrame小试牛刀,见https://segmentfault.com/a/1190000002614456
//Spark DataFrames入门指南:建立和操做DataFrame,见http://blog.csdn.net/lw_ghy/article/details/51480358
//建立dataframe ,就是把数据 和数据元封装一块儿 造成一个数据表。
//spark DataFrame用法,见http://blog.csdn.net/dreamer2020/article/details/51284789
//RDD与DataFrame的转换,见http://www.cnblogs.com/namhwik/p/5967910.html
df.show()
}
}编程
//输入
//{"name":"Michael"}
//{"name":"Andy", "age":30}
//{"name":"Justin", "age":19}json
//输出
//+----+-------+
//| age| name|
//+----+-------+
//|null|Michael|
//| 30| Andy|
//| 19| Justin|
//+----+-------+segmentfault
//输入
//{"name":"中国","provinces":[{"name":"黑龙江","citys":["佳木斯","大庆","哈尔滨","齐齐哈尔","牡丹江"]},{"name":"辽宁","citys":["沈阳","大连","盘锦"]},{"name":"吉林","citys":["吉林市","长春市","四平市"]}]}app
//输出
//+----+--------------------+
//|name| provinces|
//+----+--------------------+
//| 中国|[[WrappedArray(佳木...|
//+----+--------------------+分布式
再次强调,spark-shell除了帮咱们构建了SQLContext实例外,还帮咱们导入了隐式转换:import sqlContext.implicits._。在以spark-submit方式提交的应用程序中,须要手动导入该隐式转换才能访问某些API。
DataFrame编程模型极大地简化了Spark SQL的编程复杂度。
Spark SQL容许Spark执行用SQL语言,HiveQL语言或者Scala语言表示的关系查询。在Spark1.3以前,这个模块的核心是SchemaRDD类型。SchemaRDD由行(Row)对象组成,行对象经过scheme来描述行中每一列的数据类型。
而在Spark1.3中,开始引入了DataFrame来重命名SchemaRDD类型,在Spark1.3中,DataFrame是一个以命名列方式组织的分布式数据集,在概念上相似于关系型数据库中的一个表,也至关于R/Python中的Dta Frames。DataFrame能够由结构化数据文件转换获得,或从Hive中的表得来,也能够转换自外部数据库或现有的RDD。
DataFrame编程模型具备的功能特性有:
一、从KB到PB级的数据量支持
二、多种数据格式和多种存储系统支持
三、经过Spark SQL的Catalyst优化器进行先进的优化,生成代码
四、位Python、Java、Scala和R语言(Spark R)提供API。