与开源数据集上的 SQL 查询相比,PySpark 查询结果存在差异

问题描述 投票:0回答:1

我在位于

"/databricks-datasets/learning-spark-v2/sf-fire/sf-fire-calls.csv"
的开源数据集上运行的 PySpark 查询遇到问题。

该查询旨在检索 2018 年以来的记录,并按“Delay”列降序排列它们。但是,PySpark 查询的结果与在同一数据集上执行的等效 SQL 查询不同。

这是我正在使用的 PySpark 查询:

san_francisco_worst_response_time = fire_df.where(year(to_date(col('CallDate'), 'yyyy-mm-dd')) == 2018) \ .select('Neighborhood', 'Delay') \ .orderBy('Delay', ascending=False) display(san_francisco_worst_response_time)

Pyspark 输出:

| Neighborhood | Score | |-----------------------|---------| | West of Twin Peaks | 754.08 | | Mission | 745.93 | | Chinatown | 734.87 | | Bayview Hunters Point | 715.77 | | Bayview Hunters Point | 714.73 | | Bayview Hunters Point | 713.05 | | Bayview Hunters Point | 700.00 |
等效的 

SQL 查询 是:

SELECT Neighborhood, Delay FROM demo_db.fire_service_calls_tbl WHERE YEAR(TO_DATE(CallDate, "yyyy-MM-dd")) = 2018 ORDER BY Delay DESC;

SQL 输出:

| Neighborhood | Score | |----------------------------------|--------------| | Lincoln Park | 99.68333333 | | South of Market | 98.86666667 | | South of Market | 98.6 | | South of Market | 98.45 | | Glen Park | 98.01666667 | | Glen Park | 97.98333333 | | Financial District/South Beach | 97.78333333 |
如您所见,PySpark 和 SQL 查询结果之间存在明显差异。 SQL 查询返回的“延迟”值范围约为 

6.783 to 99.68

,而 PySpark 查询返回的“延迟”值明显更高,范围为 
9.23 to 754.08

SQL 查询是正确的,而 PySpark 查询会产生不同的结果。 任何有关潜在原因或调试步骤的见解或建议将不胜感激。

sql apache-spark pyspark databricks data-analysis
1个回答
0
投票
PySpark 和 SQL 查询结果之间的差异可能是由于 PySpark 查询中的日期格式造成的。在 PySpark 查询中,您使用“yyyy-mm-dd”作为日期格式。但是,“mm”在 SimpleDateFormat 类中表示分钟,而不是月份。这可能会导致结果出现差异。

尝试在 PySpark 查询中将“mm”替换为“MM”,如下所示:

san_francisco_worst_response_time = fire_df.where(year(to_date(col('CallDate'), 'yyyy-MM-dd')) == 2018) \ .select('Neighborhood', 'Delay') \ .orderBy('Delay', ascending=False)
显示(san_francisco_worst_response_time)

© www.soinside.com 2019 - 2024. All rights reserved.