sparkSQL中Dataframe的使用
一、簡介
Spark SQL是Spark中的一個模塊,主要用於進行結構化數據的處理。它提供的最核心的編程抽象,就是DataFrame。同時Spark SQL還可以作爲分佈式的SQL查詢引擎。SparkSQL最重要的功能之一,就是從Hive中查詢數據。
DataFrame,可以理解爲是,以列的形式組織的,分佈式的數據集合。它其實和關係型數據庫中的表非常類似,但是底層做了很多的優化。DataFrame可以通過很多來源進行構建,包括:結構化的數據文件,Hive中的表,外部的關係型數據庫,以及RDD。
二、DataFrame的創建
要使用SparkSQL,首先就得創建一個創建一個SQLContext對象,或者是它的子類的對象,比如HiveContext的對象。
Scala版本:
val sc: SparkContext = ...
val sqlContext = new SQLContext(sc)
import sqlContext.implicits._
spark2.X版本
Scala版本:
import org.apache.spark.sql.SparkSession
val spark = SparkSession
.builder()
.appName("Spark SQL basic example")
.config("spark.executor.memory", "100g")
.config("spark.cores.max", "72")
.config("spark.dynamicAllocation.enabled", "false")
.getOrCreate()
// For implicit conversions like converting RDDs to DataFrames
import spark.implicits._
除了基本的SQLContext以外,還可以使用它的子類——HiveContext。HiveContext的功能除了包含SQLContext提供的所有功能之外,還包括了額外的專門針對Hive的一些功能。這些額外功能包括:使用HiveQL語法來編寫和執行SQL,使用Hive中的UDF函數,從Hive表中讀取數據。
要使用HiveContext,就必須預先安裝好Hive,SQLContext支持的數據源,HiveContext也同樣支持——而不只是支持Hive。對於Spark 1.3.x以上的版本,都推薦使用HiveContext,因爲其功能更加豐富和完善。
Spark SQL還支持用spark.sql.dialect參數設置SQL的方言。使用SQLContext的setConf()即可進行設置。對於SQLContext,它只支持“sql”一種方言。對於HiveContext,它默認的方言是“hiveql”。
dataframe的創建和操作
方法一:
import org.apache.spark.sql.SQLContext
import org.apache.spark.{SparkConf, SparkContext}
/**
* Created by cuiyufei on 2018/3/7.
* dataframe實戰
*/
object sparkStudy {
def main(args: Array[String]) {
val conf = new SparkConf().setAppName("dataframeOperation").setMaster("local")
val sc = new SparkContext(conf)
val sparkSQL = new SQLContext(sc)
val df = sparkSQL.read.json("f://spark//students.json")
df.show()//打印DataFrame中所有的數據(select * from ...)
df.printSchema()//打印DataFrame的元數據(Schema)
df.select("name").show()//查詢某列所有的數據
df.select(df("name"), df("age")+1).show()//查詢某幾列所有的數據,並對列進行計算
df.filter(df("age")>18).show()// 根據某一列的值進行過濾
df.groupBy("age").count().show()// 根據某一列進行分組,然後進行聚合
df.createOrReplaceTempView("student")
val stuDF = sparkSQL.sql("select * from student")
stuDF.show()
}
}
方法二:
import org.apache.spark.sql.SparkSession
/**
* Created by cuiyufei on 2018/3/7.
* dataframe實戰
*/
object sparkStudy {
def main(args: Array[String]) {
val spark = SparkSession
.builder()
.appName("Spark SQL basic example")
.master("local")
.getOrCreate()
import spark.implicits._
val df = spark.read.json("f://spark//students.json")
df.show()//打印DataFrame中所有的數據(select * from ...)
df.printSchema()//打印DataFrame的元數據(Schema)
df.select("name").show()//查詢某列所有的數據
//df.select(df("name"), df("age")+1).show()//查詢某幾列所有的數據,並對列進行計算
df.select($"name", $"age"+1).show()//查詢某幾列所有的數據,並對列進行計算
df.filter(df("age")>18).show()// 根據某一列的值進行過濾
df.groupBy("age").count().show()// 根據某一列進行分組,然後進行聚合
df.createOrReplaceTempView("student")
val stuDF = spark.sql("select * from student")
stuDF.show()
}
}
students.json文件的內容如下:
{"name":"Leo", "score":85, "age": 25}
{"name":"Marry", "score":99, "age":18}
{"name":"Jack", "score":74, "age":18}