使用配置单元上下文对包含数字的字符串列进行排序



在文件中的其他列中,我有一个名为priority的列,它包含数字,例如:1、2、3、4、5、6等。文件数据如下

Department  Strength   Priority
--------------------------------
CS          Good       10
CS          Low        2
EC          Good       10
EC          Low        2
EC          Nil        3

我想使用SQL配置单元上下文的查询来选择优先级为2的记录,如下所示

select * from 
(
select testfile.*,row_number() over(partition by Department order by Priority asc) rn
from testfile
)ranked
where rn=1;

在spark代码中,所有列都被定义为String。我希望代码选择优先级2记录,因为我在order by子句中给定了asc。但是,是否有可能仅仅因为我没有将优先级列声明为int,查询就选择了2以外的优先级

CS          Good       10
EC          Good       10

但是,如果我将优先级列声明为int,则记录将正确显示为以下

CS          Low        2
EC          Low        2

我想了解这一点。有几个例子中,我将数字列声明为字符串,但顺序正确。

order by使用的是字典顺序,它类似于字母顺序,但字母顺序实际上是一种字典顺序。

这意味着以下字符串将按照以下进行排序

1 < 2
10 < 2
1000 < 2
1 < 11
10 < 11 
21 < 3  

通过一种简单的方式,你可以说它是按每个字符的位置排序的,但你可以从这里和这里的回复中阅读更多

此外,您可以选择将列强制转换为整数,以实现例如的数字排序

SELECT 
*
FROM (
SELECT 
testfile.*,
row_number() over(partition by Department order by cast(Priority as int) asc) rn
FROM 
testfile
) ranked
where rn=1;

相关内容

  • 没有找到相关文章

最新更新