Pyspark SelectExp() 不适用于 first() 和 last()

Pyspark SelectExp() not working for first() and last()

我有 2 个语句据我所知完全相同,但是 select() 工作正常,但是 selectExpr() 生成以下结果。

+-----------------------+----------------------+
|first(StockCode, false)|last(StockCode, false)|
+-----------------------+----------------------+
|                 85123A|                 22138|
+-----------------------+----------------------+

+-----------+----------+
|first_value|last_value|
+-----------+----------+
|  StockCode| StockCode|
+-----------+----------+

下面是实现。

df.select(first(col("StockCode")), last(col("StockCode"))).show()
df.selectExpr("""first('StockCode') as first_value""", """last('StockCode') as last_value""").show()

任何一位都可以解释这种行为吗?

你应该像下面这样通过

df_b = df_b.selectExpr('first(count) as first', 'last(count) as last')
df_b.show(truncate = False)

+-----+----+
|first|last|
+-----+----+
|2527 |13  |
+-----+----+

selectExpr 将所有内容作为 sql 中的 select 子句。 因此,如果你用单引号 ' 写任何东西,它将作为 sql 中的字符串。如果您想将列传递给 selectExpr 使用 backtique (`),如下所示-

df.selectExpr("""first(`StockCode`) as first_value""", """last(`StockCode`) as last_value""").show()

backtique 会帮你转义space列中的

如果您的列名称不是以 12col 之类的数字开头,或者它之间没有 space 之类的 column name[=18=,您也可以不使用 backtique ]

df.selectExpr("""first(StockCode) as first_value""", """last(StockCode) as last_value""").show()