Databricks中PySpark去重代码执行后无返回行的原因排查
PySpark去重后无结果问题排查
问题背景
DataFrame结构与数据如下:
| Id | createdon | SinkModifiedOn | title | caltype |
|---|---|---|---|---|
| e64650d3-94fb-ec11-82e6-0022481b14fc | 04/07/2022 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 8b97aa35-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| bd97aa35-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 17/01/2023 18:08:12 | Partner | Enterprise |
| 42b5f518-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 17/01/2023 18:08:12 | Partner | Enterprise |
| 8ab2abf9-6169-ec11-8943-000d3a870a5b | 30/12/2021 | 16/01/2023 14:37:14 | Partner | Basic |
| 2d51010f-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 40e1feb7-efa5-e811-a96b-00224800cdc2 | 22/08/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| d3320875-1e81-e811-a95c-00224800cc97 | 06/07/2018 | 17/01/2023 18:08:12 | Partner | Enterprise |
| 1ea0055a-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 81cf613f-1e81-e811-a95c-00224800cc97 | 06/07/2018 | 17/01/2023 18:08:12 | Partner | Enterprise |
| fb50010f-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| af4a3b88-1d81-e811-a95c-00224800c4f1 | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 0551010f-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 8c20f753-5a78-e811-a95b-00224800c3e8 | 25/06/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| e597aa35-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 0adad377-b039-e911-a999-00224800c9f4 | 26/02/2019 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 3315cd94-1d81-e811-a95c-00224800c4f1 | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 151ca1a8-a586-e811-a95c-00224800c4f1 | 13/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 55ce798d-2081-e811-a95c-00224800cc97 | 06/07/2018 | 17/01/2023 18:08:12 | Partner | Enterprise |
| 55ce798d-2081-e811-a95c-00224800cc97 | 06/07/2018 | 16/01/2023 13:37:09 | Partner | Enterprise |
| 6fa9fe08-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 8197aa35-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 4151010f-1d81-e811-a95c-00224800c9ff | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
| 74cf613f-1e81-e811-a95c-00224800cc97 | 06/07/2018 | 16/01/2023 14:37:14 | Partner | Enterprise |
执行以下PySpark代码去重后未返回任何行,怀疑问题与SinkModifiedOn字段相关:
from pyspark.sql.window import Window from pyspark.sql.functions import row_number df2 = partdf.withColumn("rn", row_number().over(Window.partitionBy("Id","CreatedOn").orderBy("SinkModifiedOn"))) df3 = df2.filter("rn = 1").drop("rn")
问题原因分析
- 列名大小写不匹配:DataFrame中的列名为
createdon(全小写),但代码中partitionBy使用的是CreatedOn(首字母大写)。Spark默认列名区分大小写,这会导致窗口函数无法正确识别分区列,引发异常后最终无数据返回。 - 日期字段类型隐患:
SinkModifiedOn当前是字符串类型,按字符串排序可能出现逻辑错误(比如按字符逐个比较而非时间先后),虽不会直接导致无结果,但会影响去重结果的准确性。
修复方案
方案1:修正列名大小写
将代码中的CreatedOn改为createdon,匹配DataFrame实际列名:
from pyspark.sql.window import Window from pyspark.sql.functions import row_number df2 = partdf.withColumn("rn", row_number().over(Window.partitionBy("Id","createdon").orderBy("SinkModifiedOn"))) df3 = df2.filter("rn = 1").drop("rn")
方案2:优化日期排序逻辑(可选)
将SinkModifiedOn转换为日期时间类型后再排序,确保排序逻辑符合时间先后:
from pyspark.sql.window import Window from pyspark.sql.functions import row_number, to_timestamp # 转换字符串为日期时间类型 partdf = partdf.withColumn("SinkModifiedOn", to_timestamp("SinkModifiedOn", "dd/MM/yyyy HH:mm:ss")) # 执行去重 df2 = partdf.withColumn("rn", row_number().over(Window.partitionBy("Id","createdon").orderBy("SinkModifiedOn"))) df3 = df2.filter("rn = 1").drop("rn")
内容的提问来源于stack exchange,提问作者Patterson
相关产品推荐
相关产品推荐

