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

l3zydbqr  于 2021-07-14  发布在  Spark
关注(0)|答案(1)|浏览(244)

我在文件中的其他列中有一个名为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的记录,因为我已经给出了 ascorder by 条款。但是有没有可能仅仅因为我没有将priority列声明为int,查询就选择了priority而不是2呢

CS          Good       10
 EC          Good       10

但是如果我声明priority列为 int ,记录将正确显示如下

CS          Low        2
 EC          Low        2

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

mwngjboj

mwngjboj1#

这个 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;

相关问题