spark-10.sparkSQL_1_sparkSQL概述與數據轉換

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] 

即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章