我在位于
"/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 查询会产生不同的结果。 任何有关潜在原因或调试步骤的见解或建议将不胜感激。
尝试在 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)