1.sparkSQL概述
sparkSQL是spark的一個模塊,可以和RDD進行混合編程、支持標準的數據源、可以集成和替代Hive、可以提供JDBC\ODBC服務器功能。
sparkSQL裏面有兩個新的數據抽象:DataFrame和DataSet。
DataFrame:
SQL操作主要涉及到表的操作,表是數據和schema組成的,所以可以認爲DataFrame就是一張表 = RDD+Schema。
DataFrame的執行效率比RDD要高,主要表現在定製化的內存管理和優化的執行引擎。
DataFrame是一個弱類型的數據對象,缺少數據類型安全檢查,運行期檢查,類似於java.sql.ResultSet類,只能通過getString這種方式來獲取具體數據。
DataSet:
type DataFrame = DataSet[Row]
DataSet具有DataFrame所有好處,同時配合case class來實現強類型,具有局部序列化和反序列化功能。
RDD和DataFrame和DataSet之間可以進行數據轉換。
2.數據轉換
sparkSQL初探
1.sparksql讀取json,需要一行是一個json。
scala> val employee = spark.read.json("/opt/module/spark-2.1.1-bin-hadoop2.7/examples/src/main/resources/people.json")
2.通過創建SparkSession來使用SparkSQL。
package com.dengdan.sparksql
import org.apache.spark.SparkConf
import org.apache.spark.sql.SparkSession
object SparkSqlHello extends App {
//初始化
val sparkConf = new SparkConf().setAppName("sparksql").setMaster("local[*]")
val spark = SparkSession.builder().config(sparkConf).getOrCreate()
val sc = spark.sparkContext
//--------------------業務邏輯 start----------------------------------
val employee = spark.read.json("")
employee.show()
employee.select("name").show()
employee.createOrReplaceTempView("employee")
spark.sql("select * from employee").show()
//--------------------業務邏輯 end----------------------------------
spark.stop()
}
RDD與DataFrame之間的轉換
需要導入隱式轉換,在spark-shell環境下:import spark.implicits._
【spark
不是包名,而是sparkSession對象的名稱。】
RDD->DataFrame:
確定Schema。有三種方式:
1.直接手動確定。
peopleRDD.map{x=>
val para= x.split(“,”)
(para(0),para(1).trim.toInt)
}.toDF(“name”,”age”)
2.通過反射確定。
利用case class People(name:String, age:Int)
scala> case class People(name:String,age:Int)
scala> val peopleRdd = sc.textFile("examples/src/main/resources/people.txt")
scala> peopleRdd.map{x=> val para = x.split(",");People(para(0),para(1).trim.toInt)}.toDF
3.通過編程方式來確定。
val peopleRdd = sc.textFile("examples/src/main/resources/people.txt")
import org.apache.spark.sql.types._
//準備Schema
val schema = StructType(StructField("name",StringType)::StructField("age",IntegerType)::Nil)
import org.apache.spark.sql._
//準備data【需要Row類型】
val data = peopleRdd.map{x=> val para = x.split(",");Row(para(0),para(1).trim.toInt)}
//生成dataFrame
val dataFrame= spark.createDataFrame(data,schema)
dataFrame.show
DataFrame-> RDD:
dataFrame.rdd即可,返回的是RDD[Row]。
RDD與DataSet之間的轉換
1.RDD->DataSet:
(case class 確定Schema)
case class People(name:String,age:Int)
peopleRdd.map{x=> val para = x.split(",");People(para(0),para(1).trim.toInt)}.toDS
2.DataSet->RDD:
dataSet.rdd即可,返回的RDD[People]
DataFrame與DataSet之間的轉換
1.DataSet->DataFrame
(強類型->弱類型)
dataSet.toDF 即可,直接複用case class的名稱。
2.DataFrame ->DataSet
(Schema需要藉助case class)【DF的列名要和case class的列名一致。】
case class People(name:String,age:Int)
dataFrame.as[People]
即可。