Spark SQL 内置函数

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类型,转换之后就可以调用各种内置函数进行操作

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值