dataframe dataset 与 SparkSession
1,dataframe 是 dataset[Row]
2,dataframe 存储着 schema(数据的结构信息,字段与类型等) 信息
3,dataset 可以实现实时批量处理的一种方式
4,RDD dataframe DataSet 可以互相转换
5,SparkSession(编程入口) 整合了 SparkContext 与 SQLContext
6,dataframe 对应 SQLContext,DataSet 对应 SparkSession
7,dataset 与 dataframe 是基于 RDD基础之上的一种封装,弹性分布式数据集
8,Spark SQL的统一入口就是SparkSession,SparkSession,可以同时实例化Spark和SQL Contexts,并确保没有Context冲突
package Day3
import org.apache.log4j.{Level, Logger}
import org.apache.spark.sql.SparkSession
object DatasetDemo {
// 屏蔽日志 设置日志级别 getLogger 获取来自哪里的日志
Logger.getLogger("org").setLevel(Level.ERROR)
def main(args: Array[String]): Unit = {
val spark = SparkSession.builder()
.appName(this.getClass.getName)
.master("local[*]")
.getOrCreate()
// 获取 sc 与 context
// SparkSession 包含了 SparkContext 与 SQLContext
val context = spark.sqlContext
val sc = spark.sparkContext
val dsl = spark.read.textFile("person.txt")
dsl.printSchema()
/*
root
|-- value: string (nullable = true)
* */
import spark.implicits._
val ds2 = dsl.map(str =>{
val arr = str.split(",")
(arr(0),arr(1).toInt,arr(2).toInt)
})
ds2.printSchema()
/*
root
|-- _1: string (nullable = true)
|-- _2: integer (nullable = true)
|-- _3: integer (nullable = true)
*/
// 自定义字段的名称
val pdf = ds2.toDF("name","age","core")
pdf.printSchema()
/*
root
|-- name: string (nullable = true)
|-- age: integer (nullable = true)
|-- core: integer (nullable = true)
*/
// Sql 注册临时表实现查询
pdf.createTempView("v_person")
val df3 = spark.sql("select * from v_person order by age desc")
df3.show()
/*
+--------+---+----+
| name|age|core|
+--------+---+----+
| lusi| 34| 97|
| jie| 24| 19|
|xiaoming| 23| 12|
+--------+---+----+
* */
// DSL 实现查询
val sdf = pdf.select("name",cols = "age")
sdf.show()
/*
+--------+---+
| name|age|
+--------+---+
|xiaoming| 23|
| jie| 24|
| lusi| 34|
+--------+---+
* */
// 两种过滤方式过滤 $表示取列的值
// pdf.where("age<25").show()
pdf.filter($"age"<25&&$"core">12).show()
/*
+--------+---+----+
| name|age|core|
+--------+---+----+
| jie| 24| 19|
+--------+---+----+
* */
// 两种排序 默认升序 age 升序 core 降序
pdf.orderBy($"age",-$"core").show()
// pdf.orderBy($"age",$"core" desc).show()
/*
+--------+---+----+
| name|age|core|
+--------+---+----+
|xiaoming| 23| 12|
| jie| 24| 19|
| lusi| 34| 97|
+--------+---+----+
* */
pdf.limit(2).show()
// 分组不生成新的 RDD 函数才生成新的 RDD
val df4 = pdf.groupBy($"age").max("core")
// pdf.groupBy($"age").count().show()
// 更改列名称
df4.toDF("age","core-max").show()
/*
+---+---------+
|age|core-max |
+---+---------+
| 34| 97|
| 23| 12|
| 24| 19|
+---+---------+
* */
// 导入聚合函数
import org.apache.spark.sql.functions._
pdf.groupBy($"age").agg(count("*") as "cnts" ).show()
/*
+---+----+
|age|cnts|
+---+----+
| 34| 1|
| 23| 1|
| 24| 1|
+---+----+
* */
// 第一个 count 表示组内元素的个数 二个是集合之中个数
println(pdf.groupBy($"age").count().count())
// sparkContext stop
spark.close()
}
}