Как Hive порядковые номера? - PullRequest
1 голос
/ 10 января 2020

Я заметил странное поведение Улья. Кажется, не упорядочить столбцы правильно. вот что я сделал:

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 заказывает свои числовые столбцы, пожалуйста? Спасибо.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Это зависит от типа столбца.

Если это тип чисел c, их значения сравниваются:

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

Строки сравниваются лексикографически:

Это определение лексикографии c упорядочения.

Если две строки различны, то либо они имеют разные символы в некотором индексе, который является допустимым индексом для обеих строк, либо их длины различны, либо в обоих случаях. Если они имеют разные символы в одной или нескольких позициях индекса, пусть k будет наименьшим таким индексом; затем строка, символ которой в позиции k имеет меньшее значение, как определено с помощью оператора <, лексикографически предшествует другой строке. В этом случае <code>compareTo возвращает разницу двух символьных значений в позиции k в двух строках, то есть значение: this.charAt(k)-anotherString.charAt(k)

Если нет позиции индекса, в которой они отличаются затем более короткая строка лексикографически предшествует более длинной строке. В этом случае compareTo возвращает разницу длин строк, то есть значение: this.length()-anotherString.length()

См. Исходный код String.compareTo для лучшего понимания: * Метод 1034 *

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.

0 голосов
/ 10 января 2020

Предположительно, id хранится в виде некоторого числа - целого, десятичного или любого другого.

И 9.60 <<code>000000010302 как числа.

...