dataframe dataset 与 SparkSession(代码示例)
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() } }