Spark SQL中窗口函数(三个案例示例代码)

需要用到的依赖

 <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-core_2.11</artifactId>
    <version>2.4.4</version>
  </dependency>
  <dependency>
    <groupId>org.apache.spark</groupId>
    <artifactId>spark-sql_2.11</artifactId>
    <version>2.4.4</version>
  </dependency>
查询员工信息和部门员工的最高工资
object SparkSQLExample {
  def main(args: Array[String]): Unit = {
	//1.创建Spark SQL 应用运行环境对象
	val spark = SparkSession.builder().appName("quick example").master("local[*]").getOrCreate()
	
	//2.创建数据源对象 Dataset 和 DataFrame
	import spark.implicits._
	spark
		.sparkContext.makeRDD(List(
		  (1, "zs", 18, 1500, "A", true),
	      (2, "ls", 20, 3000, "B", false),
	      (3, "ww", 20, 2000, "B", false),
	      (4, "zl", 30, 3500, "A", true),
	      (3, "tq", 40, 2500, "A", false)
		))
		
	//字段起别名
	.toDF("id", "name", "age", "salary", "dept_id", "sex")
	.createOrReplaceTempView("t_user")

	//窗口函数语法
	spark
		.sql("select id,name,age,salary,dept_id,sex, max(salary) over(partition by dept_id) as dept_max_salary from t_user")
		.show()

	//4.释放资源
	spark.show()
	}
}
统计某天每个用户访问次数前十的页面
object SparkSQLExample2 {
  def main(args: Array[String]): Unit = {
	//1.创建Spark SQL 应用运行环境对象
	val spark = SparkSession.builder().appName("quick example").master("local[*]").getOrCreate()

	//2.构建数据源对象 Dataset 和 DataFrame
	//导入外部的隐式转换
	import spark.implicits._
	spark
		.sparkContext
		.makeRDD(
			  List(
	          ("2018-01-01", 1, "www.baidu.com", "10:01"),
	          ("2018-01-01", 2, "www.baidu.com", "10:01"),
	          ("2018-01-01", 1, "www.sina.com", "10:01"),
	          ("2018-01-01", 3, "www.baidu.com", "10:01"),
	          ("2018-01-01", 3, "www.baidu.com", "10:01"),
	          ("2018-01-01", 1, "www.sina.com", "10:01")
	        )
		)
		.toDF("day", "user_id", "page_id", "time")
		.createOrReplaceTempView("t_page")
		
		//窗口函数语法
		spark
			.sql("select * from (select user_id,page_id,num,rank() over(partition by user_id order by num desc) as rank from (select user_id,page_id,count(page_id) as num from t_page group by user_id,page_id)) where rank < 10")
			.show()

		//4.释放资源
		spark.stop()
    }
}
连续时间区间
object SparkSQLExample3 {
  def main(args: Array[String]): Unit = {
	//1.创建Spark SQL
	val spark = SparkSession.builder().appName("quick example").master("local[*]").getOrCreate()

	import spark.implicits._

	val df = spark.sparkContext.textFile("D:\workspace\hadoop\Spark-review\src\main\resources").toDF

	df
		.flatMap(row => {
		val line = row.getString(0)
		val arr = line.split("\\s")
		Array(arr(1),arr(2))
	})
	.createOrReplaceTempView("t_time")

	spark
		.sql("select value,max(value) over(order by value asc rows between 0 preceding and 1 following) as next_time from (select * from t_time order by value asc)")
		.show()

	//4.释放资源
	spark.stop()
	
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark SQL窗口函数是一种用于对数据进行分组和排序的函数。它可以在查询结果创建一个窗口,然后在窗口内进行聚合、排序和分析操作。窗口函数的语法结构如下所示: <窗口函数>(参数) OVER ( [PARTITION BY <列清单>] [ORDER BY <排序用清单列>] [ASC/DESC] (ROWS | RANGE) <范围条件> ) 其,关键字OVER表示这是一个窗口函数,不是普通的聚合函数。PARTITION BY子句用于指定分组字段,ORDER BY子句用于指定排序字段。ROWS/RANGE窗口子句用于控制窗口的尺寸边界,有两种选项:ROW表示物理窗口,数据筛选基于排序后的索引;RANGE表示逻辑窗口,数据筛选基于值。[1] 在Spark SQL窗口函数可以通过使用Column提供的over函数来实现。下面是一个示例代码,展示了如何使用窗口函数进行累加历史和全部统计: ```scala import org.apache.spark.sql.expressions._ val first_2_now_window = Window.partitionBy("pcode").orderBy("event_date") df_userlogs_date.select( $"pcode", $"event_date", sum($"duration").over(first_2_now_window).as("sum_duration") ).show ``` 以上代码使用了窗口函数sum来计算每个pcode和event_date的duration的累加值,并将结果命名为sum_duration。通过使用over函数和指定的窗口(first_2_now_window),我们可以在每个窗口内进行累加计算。最后,使用show方法展示结果。[3] 总结来说,Spark SQL窗口函数是一种强大的工具,可以在查询结果创建窗口,并在窗口内进行聚合、排序和分析操作。它可以通过使用Column提供的over函数来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值