Apache spark 为什么pyspark dataframes/RDD中没有区分连续行的通用方法?
我经常遇到这样一个用例,即我有一个(按时间顺序排列的)Spark数据帧,其中的值是我想知道连续行之间的差异的值:Apache spark 为什么pyspark dataframes/RDD中没有区分连续行的通用方法?,apache-spark,pyspark,apache-spark-sql,Apache Spark,Pyspark,Apache Spark Sql,我经常遇到这样一个用例,即我有一个(按时间顺序排列的)Spark数据帧,其中的值是我想知道连续行之间的差异的值: >>> df.show() +-----+----------+----------+ |index| c1| c2| +-----+----------+----------+ | 0.0|0.35735932|0.39612636| | 1.0| 0.7279809|0.54678476| | 2.0|0.68788993|0.
>>> df.show()
+-----+----------+----------+
|index| c1| c2|
+-----+----------+----------+
| 0.0|0.35735932|0.39612636|
| 1.0| 0.7279809|0.54678476|
| 2.0|0.68788993|0.25862947|
| 3.0| 0.645063| 0.7470685|
+-----+----------+----------+
关于如何做到这一点的问题以前曾在更狭隘的背景下提出:
然而,我发现答案相当复杂:
- 必须导入单独的模块“窗口”
- 对于某些数据类型(日期时间),必须执行强制转换
- 然后使用“lag”最后可以比较行
>>> import pyspark.sql.functions as f
>>> df.select(f.diffs(df.c1)).show()
+----------+
| diffs(c1)|
+----------+
| 0.3706 |
| -0.0400 |
| -0.0428 |
| null |
+----------+
原因是什么?有几个基本原因:
- 一般来说,Spark中使用的分布式数据结构不是有序的。特别是,任何包含洗牌阶段/交换的沿袭都可以输出具有非确定性顺序的结构
因此,当我们谈论Spark
时,我们实际上指的是关系而不是像Pandas这样的本地库所知的DataFrame,如果没有明确的顺序,比较连续的行就没有意义DataFrame
- 当您意识到Spark中使用的排序方法使用洗牌且不稳定时,情况就更加模糊了
- 如果您忽略可能的非确定性,那么处理分区边界会有点麻烦,通常会破坏延迟执行 换言之,如果不进行洗牌、附加操作或单独的数据扫描,就无法访问从给定分区的第一个元素开始的元素,或从给定分区的最后一个元素开始的元素
- 一般来说,Spark中使用的分布式数据结构不是有序的。特别是,任何包含洗牌阶段/交换的沿袭都可以输出具有非确定性顺序的结构
因此,当我们谈论Spark
时,我们实际上指的是关系而不是像Pandas这样的本地库所知的DataFrame,如果没有明确的顺序,比较连续的行就没有意义DataFrame
- 当您意识到Spark中使用的排序方法使用洗牌且不稳定时,情况就更加模糊了
- 如果您忽略可能的非确定性,那么处理分区边界会有点麻烦,通常会破坏延迟执行 换言之,如果不进行洗牌、附加操作或单独的数据扫描,就无法访问从给定分区的第一个元素开始的元素,或从给定分区的最后一个元素开始的元素
- 有几个基本原因:
lag
函数:,,找到答案。你能想象API比使用一个函数更简单吗?:-)在这两个链接问题中,您可以使用lag
函数:,,找到答案。你能想象API比使用一个函数更简单吗?:-)