在HIve

时间:2017-04-30 22:49:41

标签: sql hive

我在Hive中创建了一个表,我在其中将Order_id字段定义为String。但它有整数值。

现在,当我运行以下SQL时,结果不正确。

select * from orders_string2 Order by order_id limit 10;

1   2013-07-25 00:00:00.0   11599   CLOSED
10  2013-07-25 00:00:00.0   5648    PENDING_PAYMENT
100 2013-07-25 00:00:00.0   12131   PROCESSING
1000    2013-07-30 00:00:00.0   2321    CLOSED
10000   2013-09-25 00:00:00.0   8983    PROCESSING
10001   2013-09-25 00:00:00.0   316 PENDING_PAYMENT
10002   2013-09-25 00:00:00.0   1530    COMPLETE
10003   2013-09-25 00:00:00.0   8099    COMPLETE
10004   2013-09-25 00:00:00.0   7768    CLOSED
10005   2013-09-25 00:00:00.0   541 COMPLETE

以下SQL给出了正确的结果:

select * from orders_string2 order by int(order_id) limit 10;

1   2013-07-25 00:00:00.0   11599   CLOSED
2   2013-07-25 00:00:00.0   256 PENDING_PAYMENT
3   2013-07-25 00:00:00.0   12111   COMPLETE
4   2013-07-25 00:00:00.0   8827    CLOSED
5   2013-07-25 00:00:00.0   11318   COMPLETE
6   2013-07-25 00:00:00.0   7130    COMPLETE
7   2013-07-25 00:00:00.0   4530    COMPLETE
8   2013-07-25 00:00:00.0   2911    PROCESSING
9   2013-07-25 00:00:00.0   5657    PENDING_PAYMENT
10  2013-07-25 00:00:00.0   5648    PENDING_PAYMENT

现在,当我运行以下SQL时,我预计结果不正确。但它运作良好。

select * from orders_string2 where order_id > 100 limit 10;

101 2013-07-25 00:00:00.0   5116    CLOSED
102 2013-07-25 00:00:00.0   8027    COMPLETE
103 2013-07-25 00:00:00.0   12256   PROCESSING
104 2013-07-25 00:00:00.0   7790    PENDING_PAYMENT
105 2013-07-26 00:00:00.0   8220    COMPLETE
106 2013-07-26 00:00:00.0   395 PROCESSING
107 2013-07-26 00:00:00.0   1845    COMPLETE
108 2013-07-26 00:00:00.0   12149   PROCESSING
109 2013-07-26 00:00:00.0   9345    PENDING_PAYMENT
110 2013-07-26 00:00:00.0   2746    COMPLETE

这个也很好,不需要铸造。 从orders_string2中选择count(*),其中order_id> 100 68783

有人可以说明这个吗?为什么WHERE和SORT BY子句的工作方式不同?

1 个答案:

答案 0 :(得分:0)

在SQL中,字符串按字母顺序排序。因此," 1"," 10"和" 100"所有人都来自" 2",就像" a"," ab"和" abc"所有人都来自" b"。这解释了前两个问题。

运行此查询时:

df.unstack().fillna(0).astype(int).stack()

你没有select * from orders_string2 where order_id > 100 limit 10; 。可以返回与order by条件匹配的任何10条记录。你是幸运的"他们是你期望的人。

如果您添加where,那么您将获得一个不同的设置,基于您问题中的数据。