我在PySpark数据框中有3列:ID,Y和空X列。
data = spark.read.options(sep="|", header="true", inferschema="true").csv(csv_file)
data.createOrReplaceTempView("TABLE_NAME")
df = spark.sql("SELECT ID, Y, X FROM TABLE_NAME")
df
ID:字符串,Y:整数,X:整数
+----+-----+---+
| ID | Y | X |
+----+-----+---+
| V1 | 0 | |
| V2 | 0 | |
| V1 | 100 | |
| V2 | 100 | |
| V1 | 250 | |
| V2 | 400 | |
+----+-----+---+
如果当前行是ID的第一个出现,我想将X计算为零,或者将ID当前发生的Y和最后出现ID的Y之间的差计算为X:
+----+-----+-----+
| ID | Y | X |
+----+-----+-----+
| V1 | 0 | 0 |
| V2 | 0 | 0 |
| V1 | 100 | 100 |
| V2 | 100 | 100 |
| V1 | 250 | 150 |
| V2 | 400 | 300 |
+----+-----+-----+
您能帮我实现这一目标吗?
非常抱歉,我无法通过手动输入来查找数据,这是我的csv_file的可再现性:
ID|Y|Date
V1|0|2018-06-22 08:33:05
V2|0|2018-06-22 08:33:05
V1|100|2018-06-22 08:34:05
V2|100|2018-06-22 08:34:05
V1|250|2018-06-22 08:35:05
V2|400|2018-06-22 08:35:05
V2|-50|2018-06-22 08:36:05
V2|400|2018-06-22 08:37:05
火花版本:2.4.0
编辑:对其他行使用史蒂文的解决方案:
+---+---+----+
| id| y| x|
+---+---+----+
| v2|-50| 0|
| v2| 0| 50|
| v2|100| 150|
| v2|400| 350|
| v2|400| -50|
| v2|400|-450|
| v1| 0| 0|
| v1|100| 100|
| v1|250| 150|
+---+---+----+
理想的结果:
+----+-----+-----+---------------------+
| id | y | x | Date |
+----+-----+-----+---------------------+
| v2 | 0 | 0 | 2018-06-22 08:33:05 |
| v2 | 100 | 100 | 2018-06-22 08:34:05 |
| v2 | 400 | 300 | 2018-06-22 08:35:05 |
| v2 | -50 | -450 | 2018-06-22 08:36:05 |
| v2 | 400 | 450 | 2018-06-22 08:37:05 |
| v1 | 0 | 0 | 2018-06-22 08:33:05 |
| v1 | 100 | 100 | 2018-06-22 08:34:05 |
| v1 | 250 | 150 | 2018-06-22 08:35:05 |
+----+-----+-----+---------------------+
使用orderBy(“ Date”):
+---+---+-------------------+----+
| id| y| Date| x|
+---+---+-------------------+----+
| v2| 0|2018-06-22 08:33:05| 0|
| v2|100|2018-06-22 08:34:05| 100|
| v2|400|2018-06-22 08:35:05| 300|
| v2|-50|2018-06-22 08:36:05|-550|
| v2|400|2018-06-22 08:37:05| -50|
| v1| 0|2018-06-22 08:33:05| 0|
| v1|100|2018-06-22 08:34:05| 100|
| v1|250|2018-06-22 08:35:05| 150|
+---+---+-------------------+----+
答案 0 :(得分:1)
这是数据框:
df.show()
+---+---+-------------------+
| id| y| date|
+---+---+-------------------+
| V1| 0|2018-06-22 08:33:05|
| V2| 0|2018-06-22 08:33:05|
| V1|100|2018-06-22 08:34:05|
| V2|100|2018-06-22 08:34:05|
| V1|250|2018-06-22 08:35:05|
| V2|400|2018-06-22 08:35:05|
| V2|-50|2018-06-22 08:36:05|
| V2|400|2018-06-22 08:37:05|
+---+---+-------------------+
您可以使用lag
获得结果:
from pyspark.sql import Window, functions as F
df.withColumn(
"x",
F.coalesce(
F.col("y")
- F.lag("y").over(
Window.partitionBy(
"id"
).orderBy(
"date"
)
),
F.lit(0)
)
).show()
+---+---+-------------------+------+
| id| y| date| x|
+---+---+-------------------+------+
| V2| 0|2018-06-22 08:33:05| 0.0|
| V2|100|2018-06-22 08:34:05| 100.0|
| V2|400|2018-06-22 08:35:05| 300.0|
| V2|-50|2018-06-22 08:36:05|-450.0|
| V2|400|2018-06-22 08:37:05| 450.0|
| V1| 0|2018-06-22 08:33:05| 0.0|
| V1|100|2018-06-22 08:34:05| 100.0|
| V1|250|2018-06-22 08:35:05| 150.0|
+---+---+-------------------+------+