簡介
Spark SQL是Spark用來處理結(jié)構(gòu)化數(shù)據(jù)的一個模塊怀偷,它提供了一個編程抽象叫做DataFrame(底層也是RDD)并且作為分布式SQL查詢引擎的作用。
引入
Hive SQL轉(zhuǎn)換成MapReduce然后提交到集群上執(zhí)行,大大簡化了編寫MapReduce的程序的復(fù)雜性,由于MapReduce這種計算模型執(zhí)行效率比較慢胞枕。所有Spark SQL的應(yīng)運而生,它是將Spark SQL轉(zhuǎn)換成特殊的RDD(DataFrame)娩嚼,然后提交到集群執(zhí)行蘑险,執(zhí)行效率非常快岳悟!
數(shù)據(jù)分析的2種方式:
①:命令式:操作面向過程和算法性的處理,(可以解決非結(jié)構(gòu)化數(shù)據(jù))
②:SQL擅長數(shù)據(jù)分析和通過簡單的語法查詢
總結(jié):SparSQL是一個為了支持SQL而設(shè)計的工具,同時也支持命令式的API
數(shù)據(jù)處理選型(應(yīng)用場景)
Spark 的RDD主要用于處理 非結(jié)構(gòu)和數(shù)據(jù) 和半結(jié)構(gòu)化數(shù)據(jù)
Spark中的SQL主要用于處理 結(jié)構(gòu)化數(shù)據(jù)(較為規(guī)范的半結(jié)構(gòu)化數(shù)據(jù)也可以處理)
SparkSQL的數(shù)據(jù)抽象
DataFrame
DataFrame是特殊得RDD
DataFrame是一個分布式的表
DataFrame ==> RDD -(泛型) + Schema(列約束信息)+方便的SQL操作+優(yōu)化
DataSet
DataSet是特殊得DataFrame,DataFrame是特殊得RDD
DataSet是一個分布式的表
DataSet ==> DataFrame+泛型
DataSet == > RDD + Schema +方便的SQL操作 +優(yōu)化
區(qū)別
相互間的轉(zhuǎn)換
DataFrame = RDD - 泛型 +Schema + SQL + 優(yōu)化
DataSet = RDD +Schema + SQL +優(yōu)化
DataSet = DataFrame +泛型 +優(yōu)化
版本
RDD(Spark1.0) -> DataFrame(Saprk1.3) -> DataSet(Spark1.6)
Spark SQL 入門
●在spark2.0之后
這些都統(tǒng)一于SparkSession佃迄,SparkSession 封裝了SqlContext及HiveContext泼差,實現(xiàn)了SQLContext及HiveContext所有功能
通過SparkSession還可以獲取到SparkConetxt
創(chuàng)建DataFrame
1.在本地創(chuàng)建一個文件,有三列呵俏,分別是id堆缘、name、age普碎,用空格分隔吼肥,然后上傳到hdfs上。vim /root/person.txt
上傳數(shù)據(jù)文件到HDFS上:
hadoop fs -put /root/person.txt? /
2.在spark shell執(zhí)行下面命令麻车,讀取數(shù)據(jù)缀皱,將每一行的數(shù)據(jù)使用列分隔符分割
先執(zhí)行
/opt/soft/spark/bin/spark-shell
val lineRDD= sc.textFile("hdfs://node01:8020/person.txt").map(_.split(" "))?
3.定義case class(相當(dāng)于表的schema)
case class Person(id:Int, name:String, age:Int)
4.將RDD和case class關(guān)聯(lián)
val personRDD = lineRDD.map(x =>Person(x(0).toInt, x(1), x(2).toInt))? ? ? ? //RDD[Person]
5.將RDD轉(zhuǎn)換成DataFrame
val personDF = personRDD.toDF
6.查看數(shù)據(jù)和schema
personDF.show
personDF.printSchema
7.注冊表
personDF.createOrReplaceTempView("t_person")
8.執(zhí)行SQL
spark.sql("select id,name from t_person
where id > 3").show
9.也可以通過SparkSession構(gòu)建DataFrame
val dataFrame=spark.read.text("hdfs://node-01:9000/person.txt") //
dataFrame.show //直接讀取的文本文件沒有schema信息
創(chuàng)建DataSet
1.通過spark.createDataset創(chuàng)建
val fileRdd = sc.textFile("hdfs://node-01:9000/person.txt"
val ds1 = spark.createDataset(fileRdd)? //DataSet[String]讀取普通文本,需要添加schema
ds1.show
2.通RDD.toDS方法生成DataSet
case class Person(name:String, age:Int)
val data = List(Person("zhangsan",20),Person("lisi",30))?
val dataRDD = sc.makeRDD(data)
val ds2 = dataRDD.toDS?
ds2.show
3.通過DataFrame.as[泛型]轉(zhuǎn)化生成DataSet
case class Person(name:String, age:Long)
val jsonDF= spark.read.json("file:///opt/soft/spark/examples/src/main/resources/people.json")
val jsonDS = jsonDF.as[Person]?
jsonDS.show
4.DataSet也可以注冊成表進(jìn)行查詢
jsonDS.createOrReplaceTempView("t_person")
spark.sql("select * fromt_person").show
總結(jié)
不管是DataFrame還是DataSet都可以注冊成表,之后就可以使用SQL進(jìn)行查詢了
DEA開發(fā)Spark SQL
第1種:指定列名添加Schema
第2種:通過StructType指定Schema
第3種:編寫樣例類,利用反射機(jī)制推斷Schema
RDD动猬、DF啤斗、DS之間的相互轉(zhuǎn)換(6種)
SQL風(fēng)格
DSL風(fēng)格