第71课:Spark SQL窗口函数解密与实战

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/someby/article/details/83926661

内容:

    1.SparkSQL窗口函数解析
    2.SparkSQL窗口函数实战

一、SparkSQL窗口函数解析

    1.spark支持两种方式使用窗口函数:
        在SQL语句中的支持的函数中添加OVER语句。例如avg(revenue) OVER (…)
        使用DataFrame API在支持的函数调用over()方法。例如rank().over(…)。
    2.当一个函数被作为窗口函数使用时,需要为该窗口函数定义相关的窗口规范。窗口规范定义了哪些行会包括到给定输入行相关联的帧(frame)中。窗口规范包括三部分:
        分区规范:定义哪些行属于相同分区,这样在对帧中数据排序和计算之前相同分区的数据就可以被收集到同一台机器上。如果没有指定分区规范,那么所有数据都会被收集到单个机器上处理。
        排序规范:定义同一个分区中所有数据的排序方式,从而确定了给定行在他所属分区中的位置
        帧规范:指定哪些行会被当前输入行的帧包括,通过其他行对于当前行的相对位置实现。

二、SparkSQL窗口函数实战

数据:TopNGroup.txt

Spark 100
Hadoop 65
Spark 99
Hadoop 61
Spark 95
Hadoop 60
Spark 98
Hadoop 69
Spark 91
Hadoop 64
Spark 89
Hadoop 98
Spark 195
Hadoop 64
Spark 98
Hadoop 66
Spark 99
Hadoop 67

Scala代码示例:

package SparkSQL

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.hive.HiveContext

/**
  * FileName: SparkSQLWindowFunctions
  * Author:   hadoop
  * Email:    [email protected]
  * Date:     18-11-10 上午8:53
  * Description:
  *
  */
object SparkSQLWindowFunctions {
  def main(args: Array[String]): Unit = {
    //创建SparkConf用于读取系统信息并设置运用程序的名称
    val conf = new SparkConf().setAppName("DataFrameScalaOps").setMaster("local")
    //创建JavaSparkContext对象实例作为整个Driver的核心基石
    val sc = new SparkContext(conf)
    //方便查看输出的日志信息,也可以设置为WARN、ERROR
    sc.setLogLevel("ERROR")
    //创建SQLContext上下文对象,用于SqL的分析
    val hiveContext = new HiveContext(sc)
    //要使用SparkSQL的内置函数,就一定要导入SQL下的隐式转换
    import hiveContext.implicits._
    hiveContext.sql("use hive") //使用名称为Hive的数据库,所有的表都在这个库中
    /**
      * 如果要创建的表存在就删除,然后创建我们要导入的数据
      */
    hiveContext.sql("drop table if exists scores")
    hiveContext.sql("create table if not scores(name string,score int) row format delimited fields terminated by ' ' lines terminated by  '\\n'")
    //把要处理的数据导入到Hive的表中
    hiveContext.sql("load data inpath '/home/hadoop/topNGroup.txt'")
    /**
      * 使用子查询的方式完成目标数据的提取,在幕表数据内幕使用窗口函数row_number进行分组排序,Partition by:指定窗口函授分组的Key
      * order by:分组进行排序
      */
    val result = hiveContext.sql("select name,score from (" +
      "select " +
      "name," +
      "score, " +
      "row_number() over (Partitopn by name order by score desc) rank " +
      "from scores )" +
      "sub_scores " +
      "where rank <=4")
    result.show()//将结果打印到控制台
    hiveContext.sql("drop table if exists sortedscore")
    result.registerTempTable("sortedscore")

  }

}

猜你喜欢

转载自blog.csdn.net/someby/article/details/83926661