每日一題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