在文件中的其他列中,我有一个名为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;