Spark的DataFrame的窗口函数使用

SparkDataFrame算子 unpersist() : 返回dataframe.this.type 类型,去除模式中的数据 unpersist(blocking:Boolean) 返回dataframe.this.type类型 true 和unpersist是一样的作用false 是去除RDD cache() 同步数据的内存 persist(newlevel:StorageLevel) 返回一个dataframe.this.type 输入存储模型类型 printSchema() 打印出字段名称和类型 按照树状结构来打印 阅读详情
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处

SparkSQL这块儿从1.4开始支持了很多的窗口分析函数,像row_number这些,平时写程序加载数据后用SQLContext 能够很方便实现很多分析和查询,如下

val sqlContext = new SQLContext(sc)

sqlContext.sql(“select ….”)

然而我看到Spark后续版本的DataFrame功能很强大,想试试使用这种方式来实现比如row_number这种功能,话不多说,快速用pyspark测试一下,记录一下遇到的问题.

from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window
from pyspark import SparkContext
sc = SparkContext("local[3]", "test data frame on 2.0")
testDF = sc.parallelize( (Row(c="class1", s=50), Row(c="class2", s=40), Row(c="class3", s=70), Row(c="class2", s=49), Row(c="class3", s=29), Row(c="class1", s=78) )).toDF()
(testDF.select("c", "s", F.rowNumber().over(Window.partitionBy("c").orderBy("s")).alias("rowNum") ).show())
 
spark-submit提交任务后直接报错如下
rddNoDFMethod

告诉我RDD没有toDF()属性,查阅spark官方文档得知还是需要用SQLContext或者sparkSession来初始化一下,先考虑用SQLContext吧,修改代码如下

from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window
from pyspark import SparkContext
from pyspark.sql import SQLContext
sc = SparkContext("local[3]", "test data frame on 2.0")
rddData = sc.parallelize( (Row(c="class1", s=50), Row(c="class2", s=40), Row(c="class3", s=70), Row(c="class2", s=49), Row(c="class3", s=29), Row(c="class1", s=78)))
sqlContext = SQLContext(sc)
testDF = rddData.toDF()
(testDF.select("c", "s", F.rowNumber().over(Window.partitionBy("c").orderBy("s")).alias("rowNum") ).show())

spark-submit提交任务后接着报另外一个错,如下

DFNoRow_number

ok,错误很清楚,rowNumber这里我写错了,没有这个函数,查阅spark源码中的functions.py,会发现如下说明

sparkDataFrameTest

这里说了,rowNumber从1.6开始,用row_number代替,直接修改py脚本如下

from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window
from pyspark import SparkContext
from pyspark.sql import SQLContext
sc = SparkContext("local[3]", "test data frame on 2.0")
rddData = sc.parallelize( (Row(c="class1", s=50), Row(c="class2", s=40), Row(c="class3", s=70), Row(c="class2", s=49), Row(c="class3", s=29), Row(c="class1", s=78)))
sqlContext = SQLContext(sc)
testDF = rddData.toDF()
(testDF.select("c", "s", F.row_number().over(Window.partitionBy("c").orderBy("s")).alias("rowNum") ).show())

这次运行没问题,结果如下

rowNumber_result

但是我只想取每组rowNum为1的那个,代码如下

from pyspark.sql import Row, functions as F
from pyspark.sql.window import Window
from pyspark import SparkContext
from pyspark.sql import SQLContext
sc = SparkContext("local[3]", "test data frame on 2.0")
rddData = sc.parallelize( (Row(c="class1", s=50), Row(c="class2", s=40), Row(c="class3", s=70), Row(c="class2", s=49), Row(c="class3", s=29), Row(c="class1", s=78)))
sqlContext = SQLContext(sc)
testDF = rddData.toDF()
result = (testDF.select("c", "s", F.row_number().over(Window.partitionBy("c").orderBy("s")).alias("rowNum")))
finalResult = result.where(result.rowNum <= 1).show()

可以看到,sql能实现的DataFrame的函数都可以实现,毕竟DataFrame是基于row和column的,就是写起来麻烦点.

参考资料:http://spark.apache.org/docs/1.3.1/api/python/pyspark.sql.html

手把手教你用OPA运放和MOS管搭建恒流源电路(附完整电路图) 本文详细介绍了如何使用OPA运放和MOS管搭建高精度恒流源电路,涵盖核心元器件选型、电路设计、工作原理及实际搭建步骤。通过负反馈控制机制和MOS管工作区设置技巧,实现稳定的电流输出,适用于LED驱动、电池充电等场景。附完整电路图和调试技巧,助您快速掌握恒流源设计。 阅读详情

相关推荐

Python实战:5分钟搞定抖音无水印视频下载(附完整代码)

本文系统介绍了抖音无水印视频下载的多种技术方案,重点解析了抖音视频的获取逻辑与去水印原理。文章提供了从零代码的浏览器插件到可编程的Python脚本的完整实现路径,并附带了详细的代码示例,帮助用户快速构建自己的抖音视频下载工具箱。

weixin_29089057的博客 763

Spark DataFrame窗口函数使用的两种形式介绍

1、概述 上文介绍了sparkdataframe常用操作算子。除此外,spark还有一类操作比较特别——窗口函数窗口函数常多用于sql,spark sql也集成了,同样,spark dataframe也有这种函数,spark sql的窗口函数spark dataframe的写法不太一样。 1.1、spark sql 写法 select pcode,event_date,sum(duration) over (partition by pcode order by event_date as.

helloxiaozhe的博客 4329

SparkDataFrame的show方法报错:不兼容的Jackson版本

当在Spark使用DataFrame的show方法时遇到"不兼容的Jackson版本"报错时,我们可以通过确认Spark版本、检查代码中的Jackson依赖、排除冲突的Jackson依赖以及更新Spark版本等方法来解决问题。排除冲突的Jackson依赖:如果代码中的某些依赖项引入了与Spark运行环境中的Jackson库版本冲突的Jackson库,可以尝试在相关依赖项中排除冲突的Jackson依赖。检查代码中的Jackson依赖:检查代码中的依赖项,特别是与Jackson相关的依赖项。

PixelInk的博客 476

DataFrame窗口函数操作

DataFrame窗口函数操作

zy345293721的博客 1013

dataframe 模仿sql实现窗口函数功能 lead lag dataframe groupy 实现窗口函数

df:DataFrame,每个工单的操作日志表。列:工单号, 操作时间,操作行为代码 我想找出有哪些工单进行了操作1之后紧接着就是进行操作5 如果是在sql中,直接用lead窗口函数就行。 但是在dataframe中,需要结合groupby和sort_values、shift来实现。 # 1. 按工单和操作时间排序 df.sort_values(['工单号','操作时间'], inplace=True) # 2. 给予每行操作一个唯一的主键 df['id'] = range(len(df)) # 3.

Caiqiudan的博客 1519

【Pandas】DataFrame操作函数

函数的传入参数根据axis来定,比如axis = 1,就会把一行数据作为Series的数据 结构传入给自己实现的函数中,我们在函数中实现对Series不同属性之间的计算,返回一个结果,则apply函数 会自动遍历每一行DataFrame的数据,最后将所有结果组合成一个。apply()的核心功能是实现“批量”调度处理,至于批量做什么,由用户传入的函数决定(自定义或现成的函数)。函数传递给apply(),apply()会帮用户在DataFrame和Series等对象中(按行或按列)批量执行传入的函数。

qq_44753772的博客 930

Spark DataFrame算子使用窗口函数

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

jiede1的博客 3775

Spark DataFrame内置sql函数总结

Spark DataFrame sql函数总结 Spark DataFrame内置了200+个函数供使用,包括聚合、集合、时间、字符串、数学、排序、窗口、UDF等多类函数,是个十分齐全的百宝箱,灵活运用可以事半功倍。 用之前需要导入sql函数 import org.apache.spark.sql.functions._ 自定义UDF函数 如果觉得百宝箱不够用,需要自己造个轮子,可以用udf来...

whgyxy的博客 1045

Spark窗口函数的综合应用指南

在大数据处理的领域中,窗口函数扮演着至关重要的角色,尤其是对于数据分析师和数据工程师来说。Apache Spark,作为当前最流行的开源大数据处理框架之一,提供了强大的窗口函数功能,极大地简化了复杂数据处理的操作。在本章节中,我们将从宏观的角度去了解Spark的Window窗口函数,为后续章节深入探讨Spark SQL和DataFrame API中的窗口函数用法、时间窗口定义与分组计算、基于RDD的窗口操作、实时数据流处理中的窗口函数应用以及窗口函数在实际应用中的案例分析打下基础。

weixin_42515842的博客 361

dataframe实现SQL的over partition by运用

这里,我们以某个班级不同ID同学,不同科目(Class)的考试成绩(Score)为例。 首先生成一个Dataframe import pandas as pd ID = [1,1,1,2,2,2,3,3,3,4,4,4] Class = ['A','B','C','A','B','C','A','B','C','A','B','C'] score = [90,80,70,60,80,100,...

书生的日常 1785

dataframe 去重复_SparkDataFrame中删除重复的行

Assume that I am having a DataFrame like :val json = sc.parallelize(Seq("""{"a":1, "b":2, "c":22, "d":34}""","""{"a":3, "b":9, "c":22, "d":12}""","""{"a":1, "b":4, "c":23, "d":12}"""))val df = sqlCont...

weixin_39866963的博客 920

spark中的Dataset和DataFrame

参考《Spark与Hadoop大数据分析》Venkat Ankam和官方文档。 利用DataFrame进行分析 创建DataFramespark2.0及更高版本开始,SparkSession成为了关系型功能的入口点。当使用Hive时,SparkSession必须使用enableHiveSupport方法创建。 从结构化数据文件中读取 #pyspark df = spa...

hello world! 2720

Pandas中DataFrame基本函数整理

构造函数 DataFrame([data, index, columns, dtype, copy]) #构造数据框 属性和数据 DataFrame.axes #index: 行标签;columns: 列标签 DataFrame.as_matrix([columns]) #转换为矩阵 DataFrame...

木柘的博客 1795

DataFrame 窗口函数rolling()

在数据开发最经常会用到将最近几个值相加、求平均等操作,使用rolling操作简单、计算效率高 官方文档链接 DataFrame.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=0, closed=None) 参数说明: window:时间窗的大小,数值int,即向前几个数据(可以理解将最近...

chinacmt的博客 2万+

时间序列:移动窗口函数(rolling,expanding)

时间序列:移动窗口函数(rolling,expanding)

AI路漫漫 1万+

pandas的窗口函数记录

3.加权移动函数:ewm(),必须指定加权元素 span、com、halflife 、alpha ——>学不懂跳过先。min_periods=n表示至少n个值求一次函数值(在实际运用中未达到n值时无结果用NaN表示)min_periods表示窗口里的最小元素数量,默认min_periods=window。center表示是否以当前元素为中心移动窗口,默认False。window等于某个标量n,则意味着从当前下标位置向前数n。closed参数具体可查看。

A81194的博客 497

SparkDataFrame基本操作函数

Action 操作 1、collect() ,返回值是一个数组,返回dataframe集合所有的行 2、collectAsList() 返回值是一个java类型的数组,返回dataframe集合所有的行 3、count() 返回一个number类型的,返回dataframe集合的行数 4、describe(cols: String*) 返回一个通过数学计算的类表值(count, mean, stddev, min, and max),这个可以传多个参数,中间用逗号分隔,如果有字段为空,那么不参与运算...

别说话写代码的博客 1622

spark的开窗函数实战

1、count(*) 2、row_number() over()排序 3、row_number() over(partition by……分区 4、【开窗嵌套开窗】rank() over() 5、dense_rank() over() 函数 一、count(*) 得到所有专业下所有老师的访问数: valmiddleData:DataFrame=session.sql(...

qq_34936033的博客 637

Spark SQL:从入门到精通(五)[开窗函数]

概述 https://www.cnblogs.com/qiuting/p/7880500.html 介绍: 开窗函数的引入是为了既显示聚集前的数据,又显示聚集后的数据。即在每一行的最后一列添加聚合函数的结果。 开窗用于为行定义一个窗口(这里的窗口是指运算将要操作的行的集合),它对一组值进行操作,不需要使用 GROUP BY 子句对数据进行分组,能够在同一行中同时返回基础行的列和聚合列。 聚合函数...

5864

继电保护建模与仿真共17页.pdf.zip

继电保护建模与仿真共17页.pdf.zip

上一篇: 《Kafka Stream》调研:一种轻量级流计算模式
下一篇: Hive索引功能测试
Syn良子
博客等级 码龄15年 7粉丝 45原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值