Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
选择具有最大值的行,在其中组合。MAX和CAST,在spark.sql中_Sql_Apache Spark_Select_Apache Spark Sql_Greatest N Per Group - Fatal编程技术网

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

选择具有最大值的行,在其中组合。MAX和CAST,在spark.sql中,sql,apache-spark,select,apache-spark-sql,greatest-n-per-group,Sql,Apache Spark,Select,Apache Spark Sql,Greatest N Per Group,我在Spark中有一个表,其中有一个字符串类型的date\u字符串列 我希望选择与最近日期对应的行。我认为可以在一个命令中实现这一点,将字符串列转换为数字,并选择与最大日期对应的行 我试过了 SELECT *, CAST(date_string AS INT) AS date FROM data.some_table WHERE date = MAX(date) 但这给了我一个错误 Error in SQL statement: AnalysisExce

我在Spark中有一个表,其中有一个字符串类型的
date\u字符串

我希望选择与最近日期对应的行。我认为可以在一个命令中实现这一点,将字符串列转换为数字,并选择与最大日期对应的行

我试过了

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)
这给了我同样的错误信息

给我

Error in SQL statement: UnsupportedOperationException: Cannot evaluate expression: max(cast(input[71, string, false] as int))

提供与上一个命令相同的错误消息


我对Spark和SQL都是新手,所以我在这里完全迷路了。什么是实现我想要的目标的正确命令?

您似乎已经非常接近了。但是,您不能在
WHERE
子句中使用
FROM
子句中计算的列(它在
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

您不需要将日期字符串强制转换为数字。所以这应该是你想要的:

SELECT t.*
FROM data.some_table
ORDER BY date_string DESC
LIMIT 1;
这假设
date\u string
具有合理的格式,例如YYYY-MM-DD

其次,这只返回一行。如果可以有重复项,则一种方法是:

SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
                       FROM data.some_table t2
                      );

非常感谢。我明白为什么我不能得到它。。。您的解决方案的最新版本需要DESC,但在其他方面可以正常工作!虽然我确实想允许联系:)欢迎@goosheng。如果我的答案正确回答了您的问题,请单击复选标记。。谢谢
SELECT t.*
FROM data.some_table
ORDER BY date_string DESC
LIMIT 1;
SELECT t.*
FROM data.some_table t
WHERE t.date_string = (SELECT MAX(t2.date_string)
                       FROM data.some_table t2
                      );