PySpark中分区的累积和

时间:2016-08-04 20:50:36

标签: python sql apache-spark pyspark apache-spark-sql

我需要创建一个列号,该列号根据colmn TRUE中的值递增。我可以通过ID进行分区,因此我认为这会在ID更改时重置增量,我想这样做。在ID中,我想在TRUE不等于1时递增组号。当TRUE = 1时,我希望它保持与最后一个相同的数字。这是我当前ID和TRUE列的子集,GROUP显示为所需。我还有我在其中使用的LATITUDE和LONGITUDE列。

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

我希望做下面的事情,但这给了我所有的0

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')

2 个答案:

答案 0 :(得分:1)

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

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))

答案 1 :(得分:0)

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

spark.createDataFrame(
    [(3828, 0, 1), (3828, 1, 2)], ("ID", "TRUE", "GROUP")
).createOrReplaceTempView("trip_temp")

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

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

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

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

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

但请不要。