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

Ordering of a string column that contains numbers in it using hive context

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

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

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

所有列在spark代码中都定义为String。我希望代码为 select 优先级 2 记录,因为我在 order by 子句中给出了 asc。但是是否有可能查询 select 的优先级不是 2 只是因为我没有将优先级列声明为 int。现在查询获取以下数据

 CS          Good       10
 EC          Good       10

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

 CS          Low        2
 EC          Low        2

我想了解一下。有几个实例,我将数字列声明为字符串,但得到了正确的排序。

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

这意味着以下字符串将按以下顺序排列

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

简单来说,你可以说它是按每个字符位置排序的,但你可以从回复中阅读更多内容 and here

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

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