选择具有最大值的行,并结合WHERE。 MAX和CAST,在spark.sql中
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择具有最大值的行,并结合WHERE。 MAX和CAST,在spark.sql中相关的知识,希望对你有一定的参考价值。
我在Spark中有一个表,其中date_string
列的类型为字符串。
我正在寻找选择与最近日期相对应的行。我认为可以用一个命令来实现这一点,将字符串列转换为数字,然后选择与最大日期相对应的行。
我尝试过
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
WHERE
date = MAX(date)
但是这给我一个错误
Error in SQL statement: AnalysisException: cannot resolve '`date`' given input columns
所以我尝试了
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
WHERE
date = (SELECT MAX(date_string) FROM data.some_table)
给我同样的错误信息。
和
SELECT
*
FROM
(SELECT *, CAST(date_string AS INT) AS date
FROM data.some_table)
WHERE
date = MAX(date)
给我
Error in SQL statement: UnsupportedOperationException: Cannot evaluate expression: max(cast(input[71, string, false] as int))
和
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
WHERE
CAST(date_string AS INT) = MAX(CAST(date_string AS INT))
给我与上一个命令相同的错误消息。
我对Spark和SQL都是陌生的,所以我在这里完全迷失了。什么是实现我想要的正确命令?
答案
您似乎已经很接近了。但是,不能使用在FROM
子句中的WHERE
子句中计算出的列(在SELECT
子句之前进行评估)。
这应该起作用:
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
WHERE
date_string = (SELECT MAX(date_string) FROM data.some_table)
或者,如果需要在比较之前输入cast
,则:
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
WHERE
CAST(date_string AS INT) = (SELECT MAX(CAST(date_string AS INT)) FROM data.some_table)
注意,这假设您确实希望允许联系。否则,您的查询可以简化为使用限制子句:
SELECT
*,
CAST(date_string AS INT) AS date
FROM
data.some_table
ORDER BY
date_string
LIMIT 1
以上是关于选择具有最大值的行,并结合WHERE。 MAX和CAST,在spark.sql中的主要内容,如果未能解决你的问题,请参考以下文章
My SQL with Python:选择具有最高值的行并在那里更改值