Dataframe 如何根据pyspark数据Drame中行之间的差异计算并创建新列
我的DF如下所示:Dataframe 如何根据pyspark数据Drame中行之间的差异计算并创建新列,dataframe,apache-spark,pyspark,apache-spark-sql,Dataframe,Apache Spark,Pyspark,Apache Spark Sql,我的DF如下所示: objid|gpstime | gpsspeed| +------+-------------------+----- |X |2018-04-03 11:00:40| 10| |X |2018-04-03 11:00:47| 15| |X |2018-04-03 11:00:50| 10| |Y |2018-04-03 11:00:52| 30| |Y |2018-04-03 11:0
objid|gpstime | gpsspeed|
+------+-------------------+-----
|X |2018-04-03 11:00:40| 10|
|X |2018-04-03 11:00:47| 15|
|X |2018-04-03 11:00:50| 10|
|Y |2018-04-03 11:00:52| 30|
|Y |2018-04-03 11:00:59| 50|
from pyspark.sql.functions import
from pyspark.sql.window import Window
df.withColumn("time_intertweet", datediff(df.gpstime, lag(df.gpstime, 1)
.over(Window.partitionBy("gpstime")
.orderBy("gpstime"))))
结果如下所示:
objid|gpstime| gpsspeed|timeDiff |speedDiff|
+------+-------------------+--------+---------+---------+
|X|2018-04-03 11:00:40| 10| -| |
|X|2018-04-03 11:00:47| 15| 7| 5|
|X|2018-04-03 11:00:50| 10| 3| -5|
|Y|2018-04-03 11:00:52| 30| 2| 20|
|Y|2018-04-03 11:00:59| 50| 7| 20|
因此,我需要根据与现有列的差异创建两个新列,但我有一个问题。我的一列代码如下所示:
objid|gpstime | gpsspeed|
+------+-------------------+-----
|X |2018-04-03 11:00:40| 10|
|X |2018-04-03 11:00:47| 15|
|X |2018-04-03 11:00:50| 10|
|Y |2018-04-03 11:00:52| 30|
|Y |2018-04-03 11:00:59| 50|
from pyspark.sql.functions import
from pyspark.sql.window import Window
df.withColumn("time_intertweet", datediff(df.gpstime, lag(df.gpstime, 1)
.over(Window.partitionBy("gpstime")
.orderBy("gpstime"))))
有没有办法解决这个问题?您不应该按任何东西进行分区,因为您希望在不进行任何分区的情况下获取前一行。另外,如果希望以秒为单位获取时差,可能需要使用
unix\u timestamp
而不是datediff
(它返回天数的差)
感谢您的帮助,但现在我得到了“AttributeError:“DataFrame”对象没有“over”属性。在你可能做了类似于
df.over(…)
的事情之前,我没有得到它。可能是您的代码中的某个错误?尽管上述解决方案是正确的,但没有分区列的窗口操作最终会将所有数据移动到单个分区或单个节点,对于大数据必须避免。警告WindowExec:没有为窗口操作定义分区!将所有数据移动到单个分区,可能会导致严重的性能下降。