Python PySpark中分区的累积和

Python PySpark中分区的累积和,python,sql,apache-spark,pyspark,apache-spark-sql,Python,Sql,Apache Spark,Pyspark,Apache Spark Sql,我需要创建一个列,其中的组号根据colmn TRUE中的值递增。我可以按ID进行分区,所以我想这会在ID改变时重置增量,我想这样做。在ID中,每当TRUE不等于1时,我希望增加组号。当TRUE=1时,我希望它保持数字与上一个相同。这是我当前ID和TRUE列的子集,组按需要显示。我也有我在排序中使用的纬度和经度列 ID TRUE GROUP 3828 0 1 3828 0 2 3828 1 2 3828 1 2 3828 1 2 4529

我需要创建一个列,其中的组号根据colmn TRUE中的值递增。我可以按ID进行分区,所以我想这会在ID改变时重置增量,我想这样做。在ID中,每当TRUE不等于1时,我希望增加组号。当TRUE=1时,我希望它保持数字与上一个相同。这是我当前ID和TRUE列的子集,组按需要显示。我也有我在排序中使用的纬度和经度列

ID    TRUE  GROUP
3828    0   1
3828    0   2
3828    1   2
3828    1   2
3828    1   2
4529    0   1
4529    1   1
4529    0   2
4529    1   2
4529    0   3
4529    0   4
4529    1   4
4529    0   5
4529    1   5
4529    1   5
我希望做下面的事情,但这给了我所有的机会

trip.registerTempTable("trip_temp")
trip2 = sqlContext.sql('select *, sum(cast(TRUE = 0 as int)) over(partition by ID order by ID, LATITUDE, LONGITUDE) as GROUP from trip_temp')

切勿将受限关键字用作列名。即使这在某些系统中可以工作,但它很容易出错,如果您更改了解析器,它可能会停止工作,一般来说,这是非常糟糕的做法
TRUE
是布尔文字,永远不会等于
0
(使用隐式强制转换,它相当于
TRUE不是TRUE

如果您真的想让它工作,请使用反勾号:

spark.sql("SELECT `TRUE` = 0 AS foo FROM trip_temp LIMIT 2").show()

// +-----+
// |  foo|
// +-----+
// | true|
// |false|
// +-----+

但是请不要这样做。

我知道这个问题已经很老了。只是想分享给那些你可能正在寻找最佳方式的人

from pyspark.sql.window import *
import sys

cumSumPartition = Window.partitionBy(['col1','col2','col3','col4']).orderBy("col3").rowsBetween(-sys.maxsize -1,0)

temp = temp.withColumn("col5",sum(temp.col5).over(cumSumPartition))

你好欢迎光临。你能解释一下为什么以及你的答案是如何解决这个问题的吗?请看一看我刚才举的一个例子。说使用windows函数可以很容易地实现累加和、滚动和等,必须填补空白
temp
pyspark.sqlContext()
from pyspark.sql.window import *
import sys

cumSumPartition = Window.partitionBy(['col1','col2','col3','col4']).orderBy("col3").rowsBetween(-sys.maxsize -1,0)

temp = temp.withColumn("col5",sum(temp.col5).over(cumSumPartition))