本文為您介紹Spark SQL、Dataset和DataFrame相關的概念,以及Spark SQL的基礎操作。
Spark SQL、Dataset和DataFrame介紹
Spark SQL是一個用於結構化資料處理的Spark模組,與基本的Spark RDD的API不同,Spark SQL的介面還提供了更多關於資料和計算的結構化資訊。Spark SQL可以用於執行SQL查詢並從Hive表中讀取資料。
Dataset是資料的分布式集合。Dataset是Spark 1.6中添加的一個新介面,它整合了RDD和Spark SQL的優點,可以從JVM物件建構資料集,然後使用函數轉換(Map、FlatMap或Filter等)進行操作。Dataset API有Scala和Java兩種版本。Python和R不支援Dataset API,但是由於Python和R的動態特性,Dataset API的許多優點已經可用。
DataFrame是組織成命名列的Dataset。他在概念上相當於關聯式資料庫中的一個表,或R和Python中的一個DataFrame,但是進行了更豐富的最佳化。DataFrame可以從一系列廣泛的源構建,例如:結構化資料檔案、Hive中的表、外部資料庫或現有RDD。DataFrame API有Scala、Java、Python和R版本。在Scala和Java中,DataFrame由行資料集表示。在Scala API中,DataFrame只是Dataset[Row]的類型別名,而在Java API中,您需要使用Dataset<Row>來表示資料幀。
Spark SQL基礎操作
Spark SQL支援直接通過SQL語句操作資料,而Spark會將SQL進行解析、最佳化並執行。
以下樣本展示了如何使用Spark SQL進行讀取檔案。樣本如下:
樣本1:Spark支援多種資料格式,本樣本讀取了JSON格式檔案的資料,並輸出為Parquet格式。
val peopleDF = spark.read.json("examples/src/main/resources/people.json") peopleDF.write.parquet("people.parquet")樣本2:通過SQL從parquetFile表中讀出年齡在13歲到19歲之間的年輕人的名字,並轉化為DataFrame,隨後通過Map操作將名字轉化為一個可讀的形式並輸出。
val namesDF = spark.sql("SELECT name FROM parquetFile WHERE age BETWEEN 13 AND 19") namesDF.map(attributes => "Name: " + attributes(0)).show()