选择具有最大值的行,并结合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:选择具有最高值的行并在那里更改值

Oracle PLSQL - 选择具有最大值的行

从表中选择具有最大日期的行

如何选择具有最大值的行的所有列

Laravel eloquent结合max()和where()或有()

SQL选择JOIN中的行,列上具有最大值