首页 > 其他分享 >spark DSL 的开窗

spark DSL 的开窗

时间:2024-07-18 10:12:39浏览次数:4  
标签:product OVER amount sales DSL 开窗 103 spark id

withColum("新增一列的列名", 某个函数 over Window.partitionBy($"按照该字段分区").orderBy($"按照该字段排序".desc))

========================================================================================================================================

// 某个函数:

- SUM() OVER()
- MIN() OVER()
- MAX() OVER()
- AVG() OVER()
- COUNT() OVER()
- ROW_NUMBER() OVER()
- RANK() OVER()
- DENSE_RANK() OVER()

假设我们有一个名为 sales 的表,包含以下数据:

| sale_id | product_id | amount |
| ------- | ---------- | ------ |
| 1 | 101 | 200 |
| 2 | 102 | 150 |
| 3 | 103 | 300 |
| 4 | 101 | 180 |
| 5 | 103 | 250 |

=======================================================================================================================================
### 1. SUM() OVER()

计算每个产品的销售总额:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** SUM(amount) OVER (PARTITION BY product_id) AS total_sales** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | total_sales |
| ------- | ---------- | ------ | ----------- |
| 1 | 101 | 200 | 380 |
| 4 | 101 | 180 | 380 |
| 2 | 102 | 150 | 150 |
| 3 | 103 | 300 | 550 |
| 5 | 103 | 250 | 550 |

=======================================================================================================================================
### 2. MIN() OVER()

找出每个产品的最小销售额:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** MIN(amount) OVER (PARTITION BY product_id) AS min_sales** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | min_sales |
| ------- | ---------- | ------ | --------- |
| 1 | 101 | 200 | 180 |
| 4 | 101 | 180 | 180 |
| 2 | 102 | 150 | 150 |
| 3 | 103 | 300 | 250 |
| 5 | 103 | 250 | 250 |

### 3. MAX() OVER()

找出每个产品的最大销售额:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** MAX(amount) OVER (PARTITION BY product_id) AS max_sales** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | max_sales |
| ------- | ---------- | ------ | --------- |
| 1 | 101 | 200 | 200 |
| 4 | 101 | 180 | 200 |
| 2 | 102 | 150 | 150 |
| 3 | 103 | 300 | 300 |
| 5 | 103 | 250 | 300 |

### 4. AVG() OVER()

计算每个产品的平均销售额:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** AVG(amount) OVER (PARTITION BY product_id) AS avg_sales** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | avg_sales |
| ------- | ---------- | ------ | --------- |
| 1 | 101 | 200 | 190 |
| 4 | 101 | 180 | 190 |
| 2 | 102 | 150 | 150 |
| 3 | 103 | 300 | 275 |
| 5 | 103 | 250 | 275 |

### 5. COUNT() OVER()

计算每个产品的销售次数:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** COUNT(*) OVER (PARTITION BY product_id) AS sales_count** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | sales_count |
| ------- | ---------- | ------ | ----------- |
| 1 | 101 | 200 | 2 |
| 4 | 101 | 180 | 2 |
| 2 | 102 | 150 | 1 |
| 3 | 103 | 300 | 2 |
| 5 | 103 | 250 | 2 |

### 6. ROW_NUMBER() OVER()

为每个产品的销售结果分配行号:

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** ROW_NUMBER() OVER (PARTITION BY product_id ORDER BY sale_id) AS row_num** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | row_num |
| ------- | ---------- | ------ | ------- |
| 1 | 101 | 200 | 1 |
| 4 | 101 | 180 | 2 |
| 2 | 102 | 150 | 1 |
| 3 | 103 | 300 | 1 |
| 5 | 103 | 250 | 2 |

### 7. RANK() OVER()

为每个产品的销售额分配排名(并列排名时有空位):

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS sales_rank** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | sales_rank |
| ------- | ---------- | ------ | ---------- |
| 1 | 101 | 200 | 1 |
| 4 | 101 | 180 | 2 |
| 2 | 102 | 150 | 1 |
| 3 | 103 | 300 | 1 |
| 5 | 103 | 250 | 2 |

### 8. DENSE_RANK() OVER()

为每个产品的销售额分配稠密排名(并列排名时没有空位):

sql** **SELECT ** ** sale_id, ** ** product_id, ** ** amount,** ** DENSE_RANK() OVER (PARTITION BY product_id ORDER BY amount DESC) AS dense_sales_rank** **FROM sales;** **

****执行结果

| sale_id | product_id | amount | dense_sales_rank |
| ------- | ---------- | ------ | ---------------- |
| 1 | 101 | 200 | 1 |
| 4 | 101 | 180 | 2 |
| 2 | 102 | 150 | 1 |
| 3 | 103 | 300 | 1 |
| 5 | 103 | 250 | 2 |

标签:product,OVER,amount,sales,DSL,开窗,103,spark,id
From: https://www.cnblogs.com/by0429/p/18308825

相关文章

  • 详细解析Kafaka Streams中各个DSL操作符的用法
    什么是DSL?在KafkaStreams中,DSL(DomainSpecificLanguage)指的是一组专门用于处理Kafka中数据流的高级抽象和操作符。这些操作符以声明性的方式定义了数据流的转换、聚合、连接等处理逻辑,使得开发者可以更加专注于业务逻辑的实现,而不是底层的数据流处理细节。KafkaStreams......
  • Spark缓存优化:清除全部缓存
    Spark算子是分为行动子算子和转换算子的,只有遇到行动算子,计算任务才会生成一个Job任务,当算子行动算子多起来,并且交织复杂的时候,Spark去追溯数据血缘就会比较耗时了,通常我们都会直接通过persist算子存储中间的计算结果,减少数据的重复计算。//存储中间计算结果,避免Spark重复计算v......
  • spark sql的知识碎片
    sparksqlApacheSparkSQL是ApacheSpark中用于结构化数据处理的模块。它允许在大规模数据集上运行SQL查询,提供数据查询、分析和转换的能力。SparkSQL与Spark核心集成,允许你将SQL查询与其他Spark函数结合使用。主要特点:DataFrame和Dataset:DataFrame是一......
  • Spark _Exam_ 20240715
    SparkExam20240715ConclusionSB出题人出DP场,T1靠小常数通过不给提示干死选手,T2出题人认为思维难度低代码5KB,NOIP场的T3放黑题,T4又是区间DP\(\mathcalO(n^6)=117649000000\)竟然能够通过?你代码常数真的小!好的喷完了。这种场的后果就是,平均分50,最高90,最低0实际上如......
  • Spark Core的知识碎片
    spark初识什么是spark?ApacheSpark是一个开源集群计算系统,旨在快速进行数据分析。既好写运行时的也快BDASBDAS是由加利福尼亚大学伯克利分校的AMPLab开发的一套开源大数据分析工具集。其目的是为数据分析和机器学习提供高效、易用的工具。SparkSpark是BDAS的核心......
  • 一个pyspark 开发练习实例
    实例功能说明:1,使用pyspark开发了一个数据ETL,分析的练习项目。2,实例功能为,从mysql读取表数据,按照一定规则进行ETL。以csv格式保存到hadoop.并特别的使用了Spark提供的3种API进行统计分析,分别是RDD算子,Dataframe算子,SQL编程算子,进行了数量统计,3,组件版本:pyspark:3.3.1......
  • Spark算子综合案例 - Scala篇
    文章目录第1关:WordCount-词频统计代码第1关:WordCount-词频统计任务描述本关任务:使用SparkCore知识编写一个词频统计程序。编程要求请仔细阅读右侧代码,根据方法内的提示,在Begin-End区域内进行代码补充,具体任务如下:对文本文件内的每个单词都统计出其出......
  • Spark _Exam_ 20240711
    SparkExam20240711Conclusion比较可惜,做前面AB的时候状态不错,但是后面就不行了,C题直接想错了一个点,然后又没有继续想,D题确实不知道一些技巧,但是其实已经凑齐了正解的全部拼图,可以拿到60-70pts.score240|rnk3|est260|ideal360|idealrnk2A.flandreStatement定义一个序列......
  • 2024 年,Hadoop 已经被 Apache Spark 全面取代了吗?
    Hadoop是一个开源的分布式计算平台,能够处理大规模数据集,并且具备高可靠性和可扩展性。Hadoop生态系统庞大,包含了多个组件,如HDFS(HadoopDistributedFileSystem,Hadoop分布式文件系统)、YARN(YetAnotherResourceNegotiator,另一种资源协调者)、Hive、HBase等。这些组件共同构成了......
  • Spark _Exam_ 20240713
    SparkExam20240713Conclusion还可以,没有挂分(反向挂分什么鬼)。数据简直太平洋,T1放掉log,T330变80,T410%的特殊case变成30%的特殊casedp还是很不行,其他方面的思维还可以。A.不相邻集合(a)Statement称可重集合\(S\),若满足\(\forallx\inS,x-1\notinS,x+1\notinS\)......