如何解决火花sql滞后,当我更改列时结果得到不同的行
我试图在某个字段符合特定条件时滞后一个字段,并且由于我需要使用过滤器,因此我正在使用 MAX 函数将其滞后,例如 LAG 函数本身无法按我需要的方式工作。我已经能够使用下面的 ID_EVENT_LOG 代码执行此操作,但是当我在 MAX 中更改 ID_EVENT_LOG 时, em>列到 ENSAIO 列,所以我会滞后于列 ENSAIO ,它无法正常工作。下面的示例。
数据集:
+------------+---------+------+
|ID_EVENT_LOG|ID_PAINEL|ENSAIO|
+------------+---------+------+
| 1| 1| null|
| 2| 1| null|
| 3| 1|INICIO|
| 4| 1| null|
| 5| 1| null|
| 6| 1| null|
| 7| 1| FIM|
| 8| 1| null|
| 9| 1| null|
| 10| 1| null|
| 11| 2| FIM|
| 12| 2| FIM|
| 13| 2|INICIO|
| 14| 2| null|
| 15| 2| FIM|
+------------+---------+------+
工作代码
DFReadFile = spark.read.format('csv').option("header","true").option('sep',',').load('12_delete_between_inicio_fim_v4.csv')
DFReadFile.show()
DFReadFile.createOrReplaceTempView("12_delete_between_inicio_fim")
sqlDF = spark.sql("SELECT *,\
CASE \
WHEN (ENSAIO like '%null%') THEN \
MAX(CASE WHEN (ENSAIO like '%INICIO%') OR (ENSAIO like '%FIM%') THEN ID_EVENT_LOG END) \
OVER (PARTITION BY ID_PAINEL ORDER BY int(ID_EVENT_LOG) RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) \
ELSE 0 \
END as TESTE \
FROM 12_delete_between_inicio_fim")
sqlDF.show()
结果:
+------------+---------+------+-----+
|ID_EVENT_LOG|ID_PAINEL|ENSAIO|TESTE|
+------------+---------+------+-----+
| 1| 1| null| null|
| 2| 1| null| null|
| 3| 1|INICIO| 0|
| 4| 1| null| 3|
| 5| 1| null| 3|
| 6| 1| null| 3|
| 7| 1| FIM| 0|
| 8| 1| null| 7|
| 9| 1| null| 7|
| 10| 1| null| 7|
| 11| 2| FIM| 0|
| 12| 2| FIM| 0|
| 13| 2|INICIO| 0|
| 14| 2| null| 13|
| 15| 2| FIM| 0|
+------------+---------+------+-----+
Bug 解决:
数据集相同
无效的代码(唯一的更改是 ID_EVENT_LOG 更改为 ENSAIO ):
DFReadFile = spark.read.format('csv').option("header",\
CASE \
WHEN (ENSAIO like '%null%') THEN \
MAX(CASE WHEN (ENSAIO like '%INICIO%') OR (ENSAIO like '%FIM%') THEN ENSAIO END) \
OVER (PARTITION BY ID_PAINEL ORDER BY int(ID_EVENT_LOG) RANGE BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING) \
ELSE 0 \
END as TESTE \
FROM 12_delete_between_inicio_fim")
sqlDF.show()
结果:
+------------+---------+------+------+
|ID_EVENT_LOG|ID_PAINEL|ENSAIO| TESTE|
+------------+---------+------+------+
| 1| 1| null| null|
| 2| 1| null| null|
| 3| 1|INICIO| 0|
| 4| 1| null|INICIO|
| 5| 1| null|INICIO|
| 6| 1| null|INICIO|
| 7| 1| FIM| 0|
| 8| 1| null|INICIO|
| 9| 1| null|INICIO|
| 10| 1| null|INICIO|
| 11| 2| FIM| 0|
| 12| 2| FIM| 0|
| 13| 2|INICIO| 0|
| 14| 2| null|INICIO|
| 15| 2| FIM| 0|
+------------+---------+------+------+
预期结果:
+------------+---------+------+------+
|ID_EVENT_LOG|ID_PAINEL|ENSAIO| TESTE|
+------------+---------+------+------+
| 1| 1| null| null|
| 2| 1| null| null|
| 3| 1|INICIO| 0|
| 4| 1| null|INICIO|
| 5| 1| null|INICIO|
| 6| 1| null|INICIO|
| 7| 1| FIM| 0|
| 8| 1| null| FIM|
| 9| 1| null| FIM|
| 10| 1| null| FIM|
| 11| 2| FIM| 0|
| 12| 2| FIM| 0|
| 13| 2|INICIO| 0|
| 14| 2| null|INICIO|
| 15| 2| FIM| 0|
+------------+---------+------+------+
提前谢谢
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。