Spark SQL 函数
基本概念:Datasets和DataFrames
DataFrame
DataFrame是组织成命名列的数据集。它在概念上等同于关系数据库中的表,但在底层具有更丰富的优化。DataFrames可以从各种来源构建,
例如:
结构化数据文件
hive中的表
外部数据库或现有RDDs
DataFrame API支持的语言有Scala,Java,Python和R。
从上图可以看出,DataFrame多了数据的结构信息,即schema。RDD是分布式的 Java对象的集合。DataFrame是分布式的Row对象的集合。DataFrame除了提供了比RDD更丰富的算子以外,更重要的特点是提升执行效率、减少数据读取以及执行计划的优化
Datasets
Dataset是数据的分布式集合。Dataset是在Spark 1.6中添加的一个新接口,是DataFrame之上更高一级的抽象。它提供了RDD的优点(强类型化,使用强大的lambda函数的能力)以及Spark SQL优化后的执行引擎的优点。一个Dataset 可以从JVM对象构造,然后使用函数转换(map, flatMap,filter等)去操作。 Dataset API 支持Scala和Java。 Python不支持Dataset API。
代码实例
object InnerFunctionDemo2 {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("InnerFunction")
val sc: SparkContext = SparkContext.getOrCreate(conf)
val spark: SparkSession = SparkSession.builder().master("local[*]").config(conf).getOrCreate()
//直接读取本地文件后转换成DF格式
//val value= sc.textFile("ddd")
// .map(x => {
// val strings: Array[String] = x.split(",")
// Row(strings(0), strings(1))
// })
//
// val structType = StructType(
// Array(StructField("name", StringType),
// StructField("age", StringType)
// )
// )
// import spark.implicits._
// val frame1: DataFrame = spark.createDataFrame(value,structType)
val students = Seq(
Student(1, "zhangsan", "F", 20),
Student(2, "lisi", "F", 30),
Student(3, "wangwu", "F", 25),
Student(4, "zhaoliu", "F", 26),
Student(5, "songba", "M", 44),
Student(6, "qianjiu", "F", 55),
Student(7, "zhoushi", "M", 33),
Student(8, "fengshiyi", "M", 22),
Student(9, "chenshier", "M", 66),
Student(10, "weishisan", "F", 77)
)
//两种方式转换成DF
val frame: DataFrame = students.toDF()
val studentDF: DataFrame = spark.createDataFrame(students)
studentDF.printSchema()
studentDF.show()
//select avg(age) from students;
import org.apache.spark.sql.functions._
val avgAgeDF: DataFrame = studentDF.agg(avg("age"))
avgAgeDF.show()
//select gender,avg(age) as avaage from students group by gender
studentDF.groupBy("gender").agg(avg("age")).show()
studentDF.groupBy("gender").agg("age"->"avg","age"->"max","age"->"min").show()
//select count(*) from students group by gender,age
studentDF.groupBy("gender","age").count().show()
//select * from student order by age asc/desc
studentDF.sort("age").show() //默认升序
studentDF.sort($"age".desc).show() //降序
studentDF.groupBy("gender").agg(avg("age"))
.as("avgage").sort($"avgage".desc).show()
}
}
总结
需要先把创建RDD数据,以及 StructType的数据结构,就可以将数据类型转黄为DataFrame类型,转换之后就可以调用各种内置函数进行操作