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()
  }
}

 

posted @ 2019-07-03 23:34  十七楼的羊  阅读(638)  评论(0编辑  收藏  举报