首页 > 解决方案 > 使用 hive 上下文对包含数字的字符串列进行排序

问题描述

我在文件中的其他列中有一个称为优先级的列,其中包含数字例如: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 代码中定义为字符串。我希望代码选择优先级 2 记录,因为我已经给出了ascinorder by子句。但是,查询是否有可能仅仅因为我没有将优先级列声明为 int 而选择 2 以外的优先级。现在查询获取以下数据

 CS          Good       10
 EC          Good       10

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

 CS          Low        2
 EC          Low        2

我想了解这一点。在某些情况下,我将数字列声明为字符串,但顺序正确。

标签: javaapache-sparkhivecontext

解决方案


使用的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;

推荐阅读