Spark DataFrame API 不会产生与 Spark SQL 版本相同的结果
Spark DataFrame API does not yield the same result as Spark SQL version
我正在尝试将 SQL 字符串转换为 Spark DataFrame API 格式。但是,当我使用 DataFrame API 时,我得到了不同的结果。有人可以告诉我我做错了什么吗?具体来说,我想知道为什么我会得到不同的记录。我不介意不同的布局。
SQL代码
spark.sql("""SELECT delay, origin, destination,
CASE
WHEN delay > 360 THEN 'Very Long Delays'
WHEN delay > 120 AND delay < 360 THEN 'Long Delays '
WHEN delay > 60 AND delay < 120 THEN 'Short Delays'
WHEN delay > 0 and delay < 60 THEN 'Tolerable Delays'
WHEN delay = 0 THEN 'No Delays'
ELSE 'No Delays'
END AS Flight_Delays
FROM us_delay_flights_tbl
ORDER BY origin, delay DESC""").show(10, truncate=False)
Spark DataFrame API 代码
df.select("delay", "origin", "destination",
F.when(col("delay") > 360, "Very Long Delays")\
.when((col("delay") > 120) & (col("delay") < 360), "Long Delays")\
.when((col("delay") > 60) & (col("delay") < 120), "Short Delays")\
.when((col("delay") > 0) & (col("delay") < 60), "Tolerable Delays")\
.when(col("delay") == 0, "No Delays").otherwise("No Delays"))\
.orderBy("origin", "delay", ascending=False).show(10)
我从 SQL 字符串(我想要的)得到的结果
|delay|origin|destination|Flight_Delays|
+-----+------+-----------+-------------+
|333 |ABE |ATL |Long Delays |
|305 |ABE |ATL |Long Delays |
|275 |ABE |ATL |Long Delays |
|257 |ABE |ATL |Long Delays |
|247 |ABE |ATL |Long Delays |
|247 |ABE |DTW |Long Delays |
|219 |ABE |ORD |Long Delays |
|211 |ABE |ATL |Long Delays |
|197 |ABE |DTW |Long Delays |
|192 |ABE |ORD |Long Delays |
+-----+------+-----------+-------------+
only showing top 10 rows
我从DataFrame得到的结果API(这不是我想要的)
| 475| YUM| PHX|Very Long Delays|
| 347| YUM| LAX|Long Delays|
| 333| YUM| LAX|Long Delays|
| 285| YUM| PHX|Long Delays|
| 267| YUM| LAX|Long Delays|
| 236| YUM| LAX|Long Delays|
| 231| YUM| LAX|Long Delays|
我看到你在 SQL query
中提到了 ORDER BY origin, delay DESC
这意味着用 origin
按 升序 顺序排列你的行, delay
用 降序 order.In DataFrame
API 版本,其中您将 ascending
标志设置为 False
,这意味着按 降序 [=31] 中的 origin
列排序=] 以及 delay
列 降序 方式。
如果你想要一个与你的SQL查询相同的DataFrame API的示例结果,那么你可以修改如下:
orderBy(["origin", "delay"], ascending=[1, 0])
你可以参考这个link以获得更好的想法:http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=take#pyspark.sql.DataFrame.orderBy
我正在尝试将 SQL 字符串转换为 Spark DataFrame API 格式。但是,当我使用 DataFrame API 时,我得到了不同的结果。有人可以告诉我我做错了什么吗?具体来说,我想知道为什么我会得到不同的记录。我不介意不同的布局。
SQL代码
spark.sql("""SELECT delay, origin, destination,
CASE
WHEN delay > 360 THEN 'Very Long Delays'
WHEN delay > 120 AND delay < 360 THEN 'Long Delays '
WHEN delay > 60 AND delay < 120 THEN 'Short Delays'
WHEN delay > 0 and delay < 60 THEN 'Tolerable Delays'
WHEN delay = 0 THEN 'No Delays'
ELSE 'No Delays'
END AS Flight_Delays
FROM us_delay_flights_tbl
ORDER BY origin, delay DESC""").show(10, truncate=False)
Spark DataFrame API 代码
df.select("delay", "origin", "destination",
F.when(col("delay") > 360, "Very Long Delays")\
.when((col("delay") > 120) & (col("delay") < 360), "Long Delays")\
.when((col("delay") > 60) & (col("delay") < 120), "Short Delays")\
.when((col("delay") > 0) & (col("delay") < 60), "Tolerable Delays")\
.when(col("delay") == 0, "No Delays").otherwise("No Delays"))\
.orderBy("origin", "delay", ascending=False).show(10)
我从 SQL 字符串(我想要的)得到的结果
|delay|origin|destination|Flight_Delays|
+-----+------+-----------+-------------+
|333 |ABE |ATL |Long Delays |
|305 |ABE |ATL |Long Delays |
|275 |ABE |ATL |Long Delays |
|257 |ABE |ATL |Long Delays |
|247 |ABE |ATL |Long Delays |
|247 |ABE |DTW |Long Delays |
|219 |ABE |ORD |Long Delays |
|211 |ABE |ATL |Long Delays |
|197 |ABE |DTW |Long Delays |
|192 |ABE |ORD |Long Delays |
+-----+------+-----------+-------------+
only showing top 10 rows
我从DataFrame得到的结果API(这不是我想要的)
| 475| YUM| PHX|Very Long Delays|
| 347| YUM| LAX|Long Delays|
| 333| YUM| LAX|Long Delays|
| 285| YUM| PHX|Long Delays|
| 267| YUM| LAX|Long Delays|
| 236| YUM| LAX|Long Delays|
| 231| YUM| LAX|Long Delays|
我看到你在 SQL query
中提到了 ORDER BY origin, delay DESC
这意味着用 origin
按 升序 顺序排列你的行, delay
用 降序 order.In DataFrame
API 版本,其中您将 ascending
标志设置为 False
,这意味着按 降序 [=31] 中的 origin
列排序=] 以及 delay
列 降序 方式。
如果你想要一个与你的SQL查询相同的DataFrame API的示例结果,那么你可以修改如下:
orderBy(["origin", "delay"], ascending=[1, 0])
你可以参考这个link以获得更好的想法:http://spark.apache.org/docs/latest/api/python/pyspark.sql.html?highlight=take#pyspark.sql.DataFrame.orderBy