Hive 如何排序?
How does Hive order numbers?
我注意到一个奇怪的 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 如何对其编号列进行排序?谢谢。
据推测,id
存储为某种数字——整数、小数或其他。
并且 9.60
< 000000010302
作为数字。
这取决于列的类型。
如果是数值类型,比较它们的值:
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
returns 两个字符串中位置 k
的两个字符值的差异 - 即值: this.charAt(k)-anotherString.charAt(k)
如果没有索引位置不同,则较短的字符串在字典序上位于较长的字符串之前。在这种情况下,compareTo
returns 字符串长度的差异 - 即值: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
方法returns比较字符在0位置(k=0)后:7和9.
我注意到一个奇怪的 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 如何对其编号列进行排序?谢谢。
据推测,id
存储为某种数字——整数、小数或其他。
并且 9.60
< 000000010302
作为数字。
这取决于列的类型。
如果是数值类型,比较它们的值:
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
returns 两个字符串中位置 k
的两个字符值的差异 - 即值: this.charAt(k)-anotherString.charAt(k)
如果没有索引位置不同,则较短的字符串在字典序上位于较长的字符串之前。在这种情况下,compareTo
returns 字符串长度的差异 - 即值: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
方法returns比较字符在0位置(k=0)后:7和9.