选择具有最大值的行,并结合WHERE。 MAX和CAST,在spark.sql中

问题描述 投票:0回答:1

我在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都是陌生的,所以我在这里完全迷失了。什么是实现我想要的正确命令?

sql apache-spark select apache-spark-sql greatest-n-per-group
1个回答
0
投票

您似乎已经很接近了。但是,不能使用在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
© www.soinside.com 2019 - 2024. All rights reserved.