一、Spark SQL
1.易整合
2.统一的数据访问方式
3.兼容HIve
4.标准的数据连接
二、DataFrames
定义:
与RDD类似,DataFrame也是一个分布式数据容器,然而Dataframe更像传统数据库的二维表格,除了数据意外,还记录着数据的结构信息,即schema。同时,与HIve类似,DataFrame也支持嵌套数据类型(struct、array 和map)。从API的易用性来看,DataFrameAPI提供的是一套高层的关系操作,比函数式的RDDAPI更加要友好,门槛更低。由于与R和Pandas的DataFrame类似,Spark Dataframe很好地继承了传统单机数据分析的开发体验。
创建DataFrame:
在Spark SQL中SQLContext是创建DataFrame和执行SQL的入口,在spark-1.6.1中已经内置了一个sqlContext。
有两种方式可以构建DataFrame:
1.通过反射的方式创建
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("RDDDF").setMaster("local")
val sc = new SparkContext(conf)
val sQLContext = new SQLContext(sc)
//创建一个普通的RDD
val rdd = sc.textFile("C:\\Users\\lenovo\\Documents\\Tencent Files\\625139589\\FileRecv\\spark\\students.txt")
val rdd2 = rdd.map(t => {
val lines = t.split(",")
student(lines(0).toInt, lines(1), lines(2).toInt)
})
//需要导入一个隐式转换
import sQLContext.implicits._
val df = rdd2.toDF()
//注册临时表
df.registerTempTable("students")
val dfs = sQLContext.sql("select * from students where age<18")
dfs.show()
//dfs.write.mode(SaveMode.Append).text("hdfs://Spark01:9000/user")
}
}
//创建样例类
case class student(id:Int,name:String,age:Int)
2.通过编程接口的方式创建
def main(args: Array[String]): Unit = {
val conf = new SparkConf().setAppName("RDDDF02").setMaster("local")
val sc = new SparkContext(conf)
val sQLContext = new SQLContext(sc)
val rdd = sc.textFile("C:\\Users\\lenovo\\Documents\\Tencent Files\\625139589\\FileRecv\\spark\\students.txt")
val lines: RDD[Row] = rdd.map(t => {
val str = t.split(",")
Row(str(0).toInt, str(1), str(2).toInt)
})
//构建StructType
val structType = StructType(Array(StructField("id",IntegerType,true),StructField("name",StringType,true),StructField("age",IntegerType,true)))
//构建DataFrame
val df :DataFrame= sQLContext.createDataFrame(lines,structType)
//注册临时表
df.registerTempTable("stu")
//开始SQL处理数据
val sql = sQLContext.sql("select * from stu where age>17")
//转换RDD处理
sql.rdd.foreach(println)
}
四、数据源
1.从mysql中加载数据
val jdbcDF = sqlContext.read.format("jdbc").options(Map("url" ->
"jdbc:mysql://spark01:3306/spark1", "driver" -> "com.mysql.jdbc.Driver",
"dbtable" -> "person", "user" -> "root", "password" -> "root")).load()