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