Hive 如何订购编号?

Posted

技术标签:

【中文标题】Hive 如何订购编号?【英文标题】:How does Hive order numbers? 【发布时间】:2020-01-10 14:23:59 【问题描述】:

我注意到一个奇怪的 Hive 行为。似乎没有正确排列列。这就是我所做的:

select TAUX_REMU_RESEAU from t where id='000000010302'; // returns 7423.00

select TAUX_REMU_RESEAU from t order by TAUX_REMU_RESEAU desc; // and the first element was 9.60

这怎么可能?请解释一下 Hive 如何排序它的数字列?谢谢。

【问题讨论】:

能否请您发送 TAUX_REMU_RESEAU 列的数据类型?我假设它的性格。如果是,9.60大于7423是正常的 你是对的。该列是字符串。谢谢 我们有时看不到简单的 【参考方案1】:

这取决于是哪种类型的列。

如果是数值类型,则比较它们的值:

with your_table as (
select stack(2, 7423.00, 9.60) as TAUX_REMU_RESEAU  
)

select * from your_table order by TAUX_REMU_RESEAU desc;

结果:

your_table.taux_remu_reseau
7423
9.6

如果是字符串:

with your_table as (
select stack(2, '7423.00', '9.60') as TAUX_REMU_RESEAU  
)

select * from your_table order by TAUX_REMU_RESEAU desc;

结果:

your_table.taux_remu_reseau
9.60
7423.00

按字典顺序比较字符串:

这是字典顺序的定义。

如果两个字符串不同,则它们在某个索引处具有不同的字符,该索引对于两个字符串都是有效的索引,或者它们的长度不同,或两者兼而有之。如果它们在一个或多个索引位置具有不同的字符,则令 k 为最小的此类索引;然后,位置 k 处的字符具有较小值的字符串(通过使用 compareTo 返回两个字符串中位置k 的两个字符值的差值——即值:this.charAt(k)-anotherString.charAt(k)

如果它们没有不同的索引位置,则较短的字符串按字典顺序位于较长的字符串之前。在这种情况下,compareTo 返回字符串长度的差值——即值:this.length()-anotherString.length()

请参阅String.compareTo 源代码以获得更好的理解:

public int compareTo(String anotherString) 

        int len1 = value.length;

        int len2 = anotherString.value.length;

        int lim = Math.min(len1, len2);

        char v1[] = value;

        char v2[] = anotherString.value;


        int k = 0;

        while (k < lim) 

            char c1 = v1[k];

            char c2 = v2[k];

            if (c1 != c2) 

                return c1 - c2;

            

            k++;
        

    return len1 - len2;

compareTo 方法在比较 0 位置 (k=0) 的字符后返回:7 和 9。

【讨论】:

【参考方案2】:

据推测,id 存储为某种数字——整数、小数或其他。

9.60 000000010302 作为一个数字。

【讨论】:

我认为您误读了这个问题。第一个查询证明我的表中有一个 TAUX_REMU_RESEAU = 7423.00。应该在我的表中订购所有 TAUX_REMU_RESEAU 的第二个查询显示最大值等于 9.60。 7423.00 去哪儿了?

以上是关于Hive 如何订购编号?的主要内容,如果未能解决你的问题,请参考以下文章

hive中怎么求每个编号相同的中价格不超过最低价百分之30的数据

实验16-09 请在testdb中:查询既订购了“16M DRAM”商品...

如何在 Hive SQL 中获取季度至今?

数据库 分别使用一条Transact-SQL语句完成下来操作拜托各位了 3Q

SQL server 建立的触发器子查询返回值不唯一,需要用多个返回值如何操作

Hive中的Join总结