1、SparkSession
SparkSession对象提供与下层Spark功能交互的入口。允许用户用Spark的API编写Spark程序。在交互式Spark-shell中,Spark驱动器已经初始化了一个SparkSession对象,但在Spark应用程序中,需要自行创建一个Spark程序。
2、转化操作、行动操作以及惰性求值
Spark对分布式数据的操作可以分为:转化操作、行动操作。
转化操作是将Spark DataFrame转化为新的DataFrame,而不改变原有数据的操作,这赋予了DataFrame不可变的属性。所有的转化操作都是惰性求值的,具体结果不会立即计算出来。spark只是将具体转化关系作为血缘。
行动操作会出发所记录下来所有转化操作的实际求值。
惰性求值:Spark的惰性求值是指在计算过程中,对于中间结果,只有当它们被使用时才会进行计算。这意味着在执行任务时,Spark会根据需要逐步计算出最终结果,而不是一次性计算出所有中间结果。这种惰性求值的特性使得Spark能够更有效地利用计算资源,提高计算效率。
3、窄转化与宽转化
根据以来关系属于窄依赖还是宽依赖,转化操作可以分为两类
如果输出中的单个数据分区是否单个输入分区计算得到的那么该转化操作就是窄转化。
跨转化要从其他分区读取数据并进行整合
4、实例(统计M&M巧克力豆)
①展示所有州巧克力都的颜色并将结果按照降序排列
②通过过滤得到加利福尼亚州的数据
package example
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.SparkSession.setDefaultSession
import org.apache.spark.sql.functions.{col, desc}
//根据题意(DSL)
//展示所有州MM巧克力豆的颜色并展示聚合结果按照降序排列
//通过过滤得到加利福尼亚州的数据
object SparkSql01_exam1_text {
def main(args: Array[String]): Unit = {
val spark = SparkSession
.builder()
.master("local[*]")
.appName("M&M巧克力豆")
.getOrCreate()
//读取csv文件
// val mnmDF = spark.read.csv("D:\\cui\\SparkSQL1\\src\\main\\resources\\input\\mnm_dataset.csv")
val mnmDF = spark.read.format("csv")
.option("header",true)
.option("inferSchema",true)
.load("D:\\cui\\SparkSQL1\\src\\main\\resources\\input\\mnm_dataset.csv")
//展示读取后的DATAFRAME
mnmDF.show()
val mnmCountDF = mnmDF.select("*")
.groupBy("State","Color","Count")
.sum("Count")
.orderBy(desc("sum(Count)"))
//展示所有州的数据
mnmCountDF.show()
//过滤数据得到加利福尼亚州的数据(CA)
val mnmCaCountDF = mnmDF.select("*")
.where(col("State") === "CA")
.groupBy("State","Color")
.sum("Count")
.orderBy(desc("sum(Count)"))
//
// val mnmCaCountDF = mnmCountDF.select("*")
// .where(col("State") === "CA")
// .orderBy("Count")
mnmCaCountDF.show()
mnmCountDF.show()
spark.stop()
}
}