我需要创建一个列号,该列号根据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')
答案 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|
// +-----+
但请不要。