为什么在pyspark dataframes / rdds中没有通用的方法来区分连续的行?

时间:2016-12-23 17:09:50

标签: 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.25862947|
|  3.0|  0.645063| 0.7470685|
+-----+----------+----------+

关于如何做到这一点的问题之前已在较窄的背景下提出过:

pyspark, Compare two rows in dataframe

Date difference between consecutive rows - Pyspark Dataframe

但是,我发现答案很复杂:

  • 必须导入单独的模块“Window”
  • 对于某些数据类型(日期时间),必须执行强制转换
  • 然后使用“滞后”最后可以比较行

令我感到奇怪的是,这不能通过单个API调用完成,例如,所以:

>>> import pyspark.sql.functions as f
>>> df.select(f.diffs(df.c1)).show()
+----------+
| diffs(c1)|
+----------+
|   0.3706 |
|  -0.0400 |
|  -0.0428 |
|     null |
+----------+

这是什么原因?

1 个答案:

答案 0 :(得分:1)

有几个基本原因:

  • 通常,Spark中使用的分布式数据结构不是有序的。特别地,任何包含混洗阶段/交换的谱系可以输出具有非确定性顺序的结构。

    因此,当我们讨论Spark DataFrame时,我们实际上是指从Pandas等本地库中已知的关系而不是DataFrame,并且没有明确的排序来比较连续的行是没有意义的。

    < / LI>
  • 当你意识到Spark中使用的排序方法使用shuffle并且不稳定时,情况会更加模糊。

  • 如果忽略可能的非确定性处理分区边界有点涉及并且通常会中断延迟执行。

    换句话说,如果没有随机播放,附加操作或单独的数据扫描,您无法访问从给定分区的第一个元素或从给定分区的最后一个元素开始的元素。