Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 为什么pyspark dataframes/RDD中没有区分连续行的通用方法?_Apache Spark_Pyspark_Apache Spark Sql - Fatal编程技术网

Apache spark 为什么pyspark dataframes/RDD中没有区分连续行的通用方法?

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.

我经常遇到这样一个用例,即我有一个(按时间顺序排列的)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|
+-----+----------+----------+
关于如何做到这一点的问题以前曾在更狭隘的背景下提出:

然而,我发现答案相当复杂:

  • 必须导入单独的模块“窗口”
  • 对于某些数据类型(日期时间),必须执行强制转换
  • 然后使用“lag”最后可以比较行
我感到奇怪的是,这不能通过单个API调用来实现,例如,so:

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

原因是什么?

有几个基本原因:

  • 一般来说,Spark中使用的分布式数据结构不是有序的。特别是,任何包含洗牌阶段/交换的沿袭都可以输出具有非确定性顺序的结构

    因此,当我们谈论Spark
    DataFrame
    时,我们实际上指的是关系而不是像Pandas这样的本地库所知的DataFrame,如果没有明确的顺序,比较连续的行就没有意义

  • 当您意识到Spark中使用的排序方法使用洗牌且不稳定时,情况就更加模糊了

  • 如果您忽略可能的非确定性,那么处理分区边界会有点麻烦,通常会破坏延迟执行

    换言之,如果不进行洗牌、附加操作或单独的数据扫描,就无法访问从给定分区的第一个元素开始的元素,或从给定分区的最后一个元素开始的元素


    • 有几个基本原因:

      • 一般来说,Spark中使用的分布式数据结构不是有序的。特别是,任何包含洗牌阶段/交换的沿袭都可以输出具有非确定性顺序的结构

        因此,当我们谈论Spark
        DataFrame
        时,我们实际上指的是关系而不是像Pandas这样的本地库所知的DataFrame,如果没有明确的顺序,比较连续的行就没有意义

      • 当您意识到Spark中使用的排序方法使用洗牌且不稳定时,情况就更加模糊了

      • 如果您忽略可能的非确定性,那么处理分区边界会有点麻烦,通常会破坏延迟执行

        换言之,如果不进行洗牌、附加操作或单独的数据扫描,就无法访问从给定分区的第一个元素开始的元素,或从给定分区的最后一个元素开始的元素


      在两个链接问题中,您可以使用
      lag
      函数:,,找到答案。你能想象API比使用一个函数更简单吗?:-)在这两个链接问题中,您可以使用
      lag
      函数:,,找到答案。你能想象API比使用一个函数更简单吗?:-)