1. 程式人生 > 實用技巧 >每日一題20201116(11. 盛最多水的容器)

每日一題20201116(11. 盛最多水的容器)

hive和SparkSQL區別

hive將SQL轉為MapReduce   SparkSql可以簡單理解將SQL轉為RDD+優化在執行

spark處理資料型別

Spark 的 RDD 主要用於處理 非結構化資料 和 半結構化資料 結構化

SparkSQL中的SQL 主要用於處理 結構化資料(較為規範的半結構化資料也可以處理)

DataFrame

DataFrame 是一種以RDD為基礎的分散式資料集,類似傳統資料庫的二維表,DataFrame帶有Schema元資訊(列名和型別)

即DataFrame所表示的二維表資料集的每一列都帶有名稱和型別 DataFrame可以從很多資料來源構建

總結:DataFrame = RDD —泛型 +Schem+SQL+優化

DataSet

DataSet 可以通過哦JVM的物件進行構建,可以用函式式的轉換 (map \flatmap\filter)進行多種操作

DataFrame 就是DataSet[Row]

總結: DataSet =DataFrame+泛型

RDD、DataFrame、DataSet的區別

 

1.RDD[Person]

2.那麼DataFrame中的資料長這樣 

DataFrame = DataSet[Row] = RDD[Person] - 泛型 + Schema + SQL操作 + 優化

3.那麼Dataset中的資料長這樣(每行資料是個Object):

Dataset[Person] = DataFrame + 泛型

或者長這樣:Dataset[Row]

總結:

DataFrame = RDD - 泛型  +  Schema  + SQL + 優化

DataSet = DataFrame  + 泛型

DataSet  =  RDD   +  Schema  + SQL + 優化

DataFrame = DataSet[Row]

建立DataFrame(以讀取TXT為例)

//建立RDD
val lineRDD =sc.textFile("hdfs://node01:8020//test/input/person.txt").map(_.split(" "))
// 定義case class 樣例類 相當於schema
case class (id:Int,name:String,age:Int)
//關聯schema和RDD
val personDD =lineRDD.map(x =>Person(x(0).toInt,x(1),x(2).toInt))
//將RDD轉換成DataFrame
val person =personRDD.toDFS

建立DataSet

1.通過Spark.createDataSet 建立

val  fileRDD =sc.textFile("hdfs://node01:8020/test/input/person.txt")

val ds=spark.createDataset(fileRdd)

ds.show

2.通RDD.toDS生成DataSet
case class Person(name:String, age:Int)
val data = List(Person("zhangsan",20),Person("lisi",30)) //List[Person]
val dataRDD = sc.makeRDD(data)
val ds2 = dataRDD.toDS  //Dataset[Person]
ds2.show

3.通過DataFrame.as[泛型]轉化生成DataSet
case class Person(name:String, age:Long)
val jsonDF= spark.read.json("file:///export/servers/spark/examples/src/main/resources/people.json")
val jsonDS = jsonDF.as[Person] //DataSet[Person]
jsonDS.show

兩種風格

(1)DSL風格

personDF.select(personDF.col("name")).show
personDF.select(personDF("name")).show
personDF.select(col("name")).show
personDF.select("name").show

(2)SQL風格

personDF.createOrReplaceTempView("t_person")
spark.sql("select * from t_person").show