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”商品...
数据库 分别使用一条Transact-SQL语句完成下来操作拜托各位了 3Q