Spark SQL 开窗函数row_number的使用

解决Spark窗口统计函数rank()、row_number()、percent_rank()的OOM问题 目录 1. 窗口函数功能介绍 一个简单的例子 一个复杂的例子 2.数据量过大时的OOM问题 问题及原因 解决方法1:用SQL处理 解决方法2:转为rdd进行处理 解决方法3:将数据量过多的分组进行随机打散,从而近似排序 1. 窗口函数功能介绍 在利用Spark SQL按分组统计每个组内topN,或者相对某个指标归一化到[0,1]区间上时,可以使用spark的窗口函数... 阅读详情

Spark SQL 开窗函数row_number的使用

窗口函数 row_number即为分组取topN

参考文本:                   型号                      类别            销售量/月
小米,手机,250
华为,手机,450
苹果,手机,1000
三星,手机,2500
小米Pro,笔记本,1500
苹果Pro,笔记本,2000
三星Pro,笔记本,4100
华为ProX,笔记本,200
华硕,笔记本,10000
苹果,平板电脑,100
三星,平板电脑,200
华为,平板电脑,300
中兴,平板电脑,400
需求分析 : 根据文本中的类别进行分组,取月销售额的前三名:
代码:
package com.bynear.spark_sql;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.sql.DataFrame;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.SaveMode;
import org.apache.spark.sql.hive.HiveContext;

import java.util.List;

public class RowNumberWindowFunction {
    public static void main(String[] args) {
        SparkConf conf = new SparkConf();
        JavaSparkContext sc = new JavaSparkContext(conf);
        HiveContext hiveContext = new HiveContext(sc.sc());
//        创建销售额表 sales
        hiveContext.sql("drop table if exists sales");
//        hiveContext.sql("create table if not exists sales (product string, category string, revenue BIGINT)
//          row format delimited\\n\" +\n" +
//                "               \"    fields terminated by ','");

        hiveContext.sql(
                "create table if not exists sales (product string, category string, revenue bigint) row format delimited fields terminated by ',' "
        );


        hiveContext.sql("load data inpath" +
                " 'hdfs://Spark01:9000/zjs/sales.txt' into table sales ");
//
        DataFrame top3SalesDF = hiveContext.sql("select product,category,revenue from (select product, category, revenue, row_number() over (partition by category order by revenue DESC ) rank from sales ) tmp_sales where rank <=3");
        hiveContext.sql("drop table if exists top_sales");
        hiveContext.sql("create table top_sales (product string, category string, revenue bigint) ");

        top3SalesDF.write().mode(SaveMode.Append).insertInto("top_sales");
        List<Row> rows = top3SalesDF.javaRDD().collect();
        for (Row row : rows) {
            System.out.println(row);
        }
        top3SalesDF.write().format("json").save("hdfs://Spark01:9000/zjs/JSON");

        sc.close();
    }
}

注意点:文本中尽量使用英文逗号进行分割! 如果在hive库中出现 按照逗号分割之后,每行的结尾出现 NULL, 即为编码的问题!需要将文本转化为UTF-8格式,问题解决。

重点在于SQL语句中的 row_number,查看括弧是否匹配齐全!
在我的集群出现的问题!使用saveASTable方法的时候,集群直接报错!没有办法,只能使用insertInto方法了,但是必须要在代码中,手动去创建一个表,来存储最

终的结果!使用insertInto方法把结果insert到创建好的表中!

问题:为什么在我的集群中,将用例文件上传到 集群上之后,每运行一下Spark命令之后,集群上的用例文本就会被删除掉!该如何解决!

希望大佬们给出解决的方法!
开窗函数格式:
         * 【 row_number() over (partition by XXX order by XXX) as rank】//起个别名
         * 注意:rank 从1开始

运行结果:
[中兴,平板电脑,400]
[华为,平板电脑,300]
[三星,平板电脑,200]
[三星,手机,2500]
[苹果,手机,1000]
[华为,手机,450]
[华硕,笔记本,10000]
[三星Pro,笔记本,4100]
[苹果Pro,笔记本,2000]








Spark SQL 之开窗函数 目录 一:开窗函数 二:row_number()开窗函数实战 三:开窗函数与一般函数使用的区别? 一:开窗函数 开窗函数的由来: 在开窗函数出现之前存在着非常多用 SQL 语句非常难解决的问题,非常多都要通过复杂的相关子查询或者存储过程来完毕。为了解决这些问题,在2003年ISO SQL标准增加了开窗函数,开窗函数的使用使得这些经典的难题能够被轻松的解决。眼下在 MSSQLSe... 阅读详情

相关推荐

保姆级教程:在Windows上用VS2019和OpenCV4.6搞定海康MV-EB435i RGBD相机图像采集

本文提供了一份详细的教程,指导如何在Windows环境下使用VS2019和OpenCV4.6配置海康MV-EB435i RGBD相机进行图像采集。从开发环境准备、SDK部署到代码移植和优化,涵盖了深度图与RGB图同步采集的实战技巧,帮助开发者快速上手工业级RGBD相机的应用开发。

weixin_28675557的博客 469

Spark开窗函数之ROW_NUMBER()

  一、row_number函数的用法:   (1)Spark 1.5.x版本以后,在Spark SQL和DataFrame中引入了开窗函数,其中比较常用的开窗函数就是row_number      该函数的作用是根据表中字段进行分组,然后根据表中的字段排序;其实就是根据其排序顺序,给组中的每条记录添      加一个序号;且每组的序号都是从1开始,可利用它的这个特性进行分组取top-n...

bokzmm的博客 2万+

【IT小趣闻】免费的DeepSeek是如何赚钱的?

导语:目前很多的通用人工智能也就是所谓的AGI例如文心一言、豆包、通义千问和最近大火的DeepSeek都是免费给普通用户使用的,对开源商业模式不太熟悉的普通人可不太了解这免费背后的商业套路,下面我们就一起来揭秘。开源模式能降低用户信任成本、加速技术普及,而商业化服务则针对企业级需求。DeepSeek 可通过组合上述策略,在服务开发者社区的同时,满足企业客户的深度需求,实现可持续发展。你也看出来了,上边是DeepSeek生成的,讲的还是挺明白的。

SunMy的博客 1768

SparkSQL开窗函数 row_number()

开始编写我们的统计逻辑,使用row_number()函数 先说明一下,row_number()开窗函数的作用 其实就是给每个分组的数据,按照其排序顺序,打上一个分组内行号 比如说,有一个分组20151001,里面有三条数据,1122,1121,1124 那么对这个分组的每一行使用row_number()开窗函数以后,三行依次会获得一个组内的行号 行号从1开始递增,比如1122,1 1121,2...

weixin_30897079的博客 1604

使用Everything清理垃圾文件的实战方案(持续更新)

本文主要介绍了使用Everything清理垃圾文件的实战方案,希望能对同学们有所帮助。 文章目录 1. Everything工作原理简述 2. Everything实战清理垃圾文件 2.1 清理应用无用文件 2.2 清理无用但遗忘的文件 2.3 使用Python代码自动化删除重复文件

weixin_43178406的博客 2万+

Wi-Fi数据帧类别

QoS

1042484520@qq.com(邮箱) 3158

用spark实现row_number()

用spark实现row_number()

qq_42456324的博客 1334

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

海康Visionmaster-全局脚本:VM 加载方案后自动执行 的方法,如何让VM在方案加载后自动执行流程?

视觉人机器视觉的博客 2039

Spark开窗函数之ROW

Spark 1.5.x版本以后,在Spark SQL和DataFrame中引入了开窗函数,其中比较常用的开窗函数就是row_number 该函数的作用是根据表中字段进行分组,然后根据表中的字段排序;其实就是根据其排序顺序,给组中的每条记录添 加一个序号;且每组的序号都是从1开始,可利用它的这个特性进行分组取top-n。

一群专业码农的笔记本 908

YOLOv11改进策略【卷积层】| TIP 2025 MFA 多阶段特征聚合 大核扩感受 + 多梯度融合,强效增强弱小目标特征

红外弱小目标尺寸极小、信噪比低,在特征传递中极易丢失信息;常规卷积感受野单一、梯度源不足,难以同时捕捉局部细节与全局上下文,导致小目标特征表达弱、检测漏检。因此提出多阶段特征聚合 MFA,用大核卷积+多分支+通道注意力强化小目标特征提取。

Limiiiing的博客 589

【深度学习】Progressive Distillation for Fast Sampling of Diffusion Models

这种方法通过迭代地将一个需要较多步骤的模型(称为教师模型)蒸馏成一个需要较少步骤的学生模型,每次迭代都将采样步骤减半,直到达到所需的采样步骤数量。通过渐进式蒸馏,论文将原始需要8192步采样的模型成功蒸馏为只需4步采样就能取得接近的生成质量的新模型,大幅提高了扩散模型的推理效率。这篇论文提出了一种"渐进式蒸馏"(Progressive Distillation)的方法,来大幅降低用于生成对抗网络(GAN)的扩散模型(Diffusion Model)在推理阶段的采样步数,从而提高其推理效率。

q742971636的博客 1789

Spark的开窗函数demo+解析:

源文件内容示例: http://bigdata.beiwang.cn/laoli http://bigdata.beiwang.cn/laoli http://bigdata.beiwang.cn/haiyuan http://bigdata.beiwang.cn/haiyuan   实现代码: object SparkSqlDemo11 { /** ...

Lyy1016的博客 914

STC单片机 普通 I/O 口中断功能介绍和使用

STC32单片机 普通 I/O 口中断功能介绍和使用

perseverance51博客 3048

hive 开窗函数_SparkSQL的自定义函数UDF与开窗函数

一 自定义函数UDF在Spark中,也支持Hive中的自定义函数。自定义函数大致可以分为三种:UDF(User-Defined-Function),即最基本的自定义函数,类似to_char,to_date等UDAF(User- Defined Aggregation Funcation),用户自定义聚合函数,类似在group by之后使用的sum,avg等UDTF(User-Defined Tab...

weixin_39691233的博客 266

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

SparkSQL创建RDD:开窗函数学习(格式为:row_number() over(partition by xxx order by xxxx desc) xxx)

 开窗函数:  row_number()开窗函数  主要是按照某个字段分组,然后取定义字段的前几个值,相当于分割取topN的问题  row_number() over(partition by xxx order by xxxx desc) xxx  注意:  如果SQL语句里面使用了开窗函数,那么这个SQL语句必须使用HIveContext来执行,HIveContext是SQLcontext的...

wyqwilliam的博客 3763

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

关于SparkSQL的开窗函数,你应该知道这些!

1.概述介绍相信用过MySQL的朋友都知道,MySQL中也有开窗函数的存在。开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据。即在每一行的最后一列添加聚合函数的结果。开窗用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用 GROUP BY 子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。聚合函数和开窗函数聚...

大数据星球-浪尖 1704

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

Spark 开窗函数

row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN 如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,HiveContext默认情况下在本地无法创建。在MySql8之后也增加了开窗函数。 开窗函数格式: row_number() over (partitin by XXX order by XXX) ...

墨玉浮白的博客 1074

SparkSQL中开窗函数

开窗函数 注意: row_number() 开窗函数是按照某个字段分组,然后取另一字段的前几个的值,相当于 分组取topN 如果SQL语句里面使用到了开窗函数,那么这个SQL语句必须使用HiveContext来执行,HiveContext默认情况下在本地无法创建。 开窗函数格式: row_number() over (partitin by XXX order by XXX) Java...

wyqwilliam的博客 2123

Spark SQL函数小结

1.开窗函数 1. row_number() over() 示例: row_number() OVER (PARTITION BY category ORDER BY revenue DESC) rank 作用: 给每个分组的数据,按照排序顺序,打上分组内的行号(分组topN) 2. sum、max、min、count、avg等聚合函数 示例:sum(pv) over(partition by...

wintershii的博客 1158

12.Spark SQL:开窗函数以及top3销售额统计案例实战

Spark 1.4.x版本以后,为Spark SQL和DataFrame引入了开窗函数,比如最经典,最常用的,row_number(),可以让我们实现分组取topn的逻辑。 案例:统计每个种类的销售额排名前3的产品 java版本 package cn.spark.study.sql; import org.apache.spark.SparkConf; import org.ap

认知 行动 坚持 3460

mysql开窗函数有哪些,SparkSQL开窗函数topN销售额统计

package cn.spark.study.sql;import org.apache.spark.SparkConf;import org.apache.spark.api.java.JavaSparkContext;import org.apache.spark.sql.DataFrame;import org.apache.spark.sql.hive.HiveContext;/*** r...

weixin_29021195的博客 170

spark UDF,UDAF

UDF: user defined function

无境 205

SpqrkSQL的开窗函数

over()开窗函数其实就是根据指定字段分组再根据指定字段排序; package com import org.apache.spark.sql.{Dataset, SparkSession} import org.apache.spark.{SparkConf, SparkContext} object demo101 { case class StudentScore(name:St...

BIGKEY的博客 330

Spark SQL自定义函数UDF、UDAF聚合函数以及开窗函数的使用

点击上方蓝色字体,选择“设为星标”回复”资源“获取更多资源大数据技术与架构点击右侧关注,大数据开发领域最强公众号!暴走大数据点击右侧关注,暴走大数据!一、UDF的使用1、Spark SQ...

微信搜:import_bigdata,大数据领域硬核原创作者 715

好用到不行的 SparkSQL 开窗函数

好用到不行的 SQL开窗函数 To use window functions, users need to mark that a function is used as a window function by either Adding an OVER clause after a supported function in SQL, e.g. avg(revenue) OVER (…);...

csweikie的博客 538

开窗函数

一、简单概述 开窗函数与聚合函数一样,都是对行的集合进行聚合计算。 开窗用于定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用GROUP BY子句对数据进行分组,能够在同一行中同时返回基础行的行和和聚合列。 开窗函数的调用格式为:函数名(列) OVER(选项) 第一大类:聚合开窗函数 -》聚合函数 OVER(选项),这里的选项可以是PARTITION BY子句,但不可以是ORDER BY子句。 第二大类:排序开窗函数-》排序函数(列)OVER(选项),这里的选项可以是ORD

pageniao的博客 1432
上一篇: SparkSQL 内置函数的使用(JAVA与Scala版本)
下一篇: Spark SQL 中UDF的讲解
JSON_ZJS
博客等级 码龄9年 30粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值