java - 使用 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 记录,因为我已经给出了asc
inorder by
子句。但是,查询是否有可能仅仅因为我没有将优先级列声明为 int 而选择 2 以外的优先级。现在查询获取以下数据
CS Good 10
EC Good 10
但是,如果我将 Priority 列声明为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;
推荐阅读
- javascript - 如何从js中其他网页(url)的xml中获取某一行?
- sql - SQL Server - sys.dm_db_index_usage_stats 在服务器重新启动时未擦除的替代品?
- powerbi - 递归 DAX 计算解决方法
- docker - 当使用 'cat ~/my_password.txt | docker login --username foo --password-stdin',出现错误:'cat:不存在文件'和'无法执行登录'
- javascript - 在 vuex SSR 中如何获得类似 window.location.host 的内容?
- php - WooCommerce 根据自定义字段中的静态日期自动定期更改简单和可变产品的价格
- ios - Ionic iOS 上的 Twitch 嵌入式播放器无法正常工作
- javascript - 将 SVG 从文件注入到现有的 SVG 标签
- .net - 如何使用 NEST 客户端从 Powershell 批量索引弹性搜索?
- html - 父级中的div高度溢出