【发布时间】:2019-07-03 17:29:11
【问题描述】:
如何根据某些单元格之间的某些验证来更改列的值?我需要的是比较每个客户(id)记录的公里数,以比较公里数后面的记录是否更高。
fecha id estado id_cliente error_code kilometraje error_km
1/1/2019 1 A 1 10
2/1/2019 2 A ERROR 20
3/1/2019 1 D 1 ERROR 30
4/1/2019 2 O ERROR
error_km 列中的错误是因为客户 (id) 2 的 kmetraje 值小于 2/1/2019 的同一客户记录(如果时间过去了,使用了汽车,因此 kmetraje 增加了,所以有没有错误,里程必须更高或相同)
我知道 withColumn 我可以覆盖或创建一个不存在的列,并且当我可以设置条件时使用它。例如:这将是我用来验证 estado 和 id_cliente 列的代码,并且在适用的情况下 ERROR 会覆盖 error_code 列,但我不明白如何在同一客户端的不同行之间进行验证。
from pyspark.sql.functions import lit
from pyspark.sql import functions as F
from pyspark.sql.functions import col
file_path = 'archive.txt'
error = 'ERROR'
df = spark.read.parquet(file_path)
df = df.persist(StorageLevel.MEMORY_AND_DISK)
df = df.select('estado', 'id_cliente')
df = df.withColumn("error_code", lit(''))
df = df.withColumn('error_code',
F.when((F.col('status') == 'O') &
(F.col('client_id') != '') |
(F.col('status') == 'D') &
(F.col('client_id') != '') |
(F.col('status') == 'A') &
(F.col('client_id') == ''),
F.concat(F.col("error_code"), F.lit(":[{}]".format(error)))
)
.otherwise(F.col('error_code')))
【问题讨论】:
-
请不要发布截图。它们只会为回答您的questions 的人带来更多的工作。
-
是的,我知道,我还没有在 PC 上,一会儿我会修复它
标签: pyspark