Проблема с типами данных Hive - PullRequest
0 голосов
/ 10 февраля 2020

У нас есть 3 столбца из источника, colA состоит из 3 цифр, colB имеет 5 цифр и Col C имеет 5 цифр. Нам нужно создать 13 di git уникальный идентификатор, основанный на 3 столбцах выше

Query used - select colA*1000000000000 + colC*100000 + colC
Example - 

hive> select 123*1000000000000 + 12345*100000 + 12345;
OK
123001234512345 -- Not Expected
Time taken: 0.091 seconds, Fetched: 1 row(s)

При дальнейшей проверке запрос ниже куста не даст мне правильных результатов.

hive> !hive --version;
Hive 2.3.3-mapr-1904-r9
Git git://738a1fde0d37/root/opensource/mapr-hive-2.3/dl/mapr-hive-2.3 -r 265b539b942d0b9f4811b15880204dec5c0c7e1b
Compiled by root on Tue Aug 6 05:36:17 PDT 2019
From source with checksum 88f44b7532ffd7141c15cb5742e9cb51
hive> select cast(12345*1000000 as bigint);
OK
-539901888
Time taken: 0.126 seconds, Fetched: 1 row(s)
hive> select cast(12345*10000000 as bigint);
OK
-1104051584
Time taken: 0.02 seconds, Fetched: 1 row(s)
hive> select cast(12345*100000000 as bigint);
OK
1844386048
Time taken: 0.018 seconds, Fetched: 1 row(s)
hive> select cast(12345*1000000000 as bigint);
OK
1263991296
Time taken: 0.032 seconds, Fetched: 1 row(s)

В то время как приведенный ниже запрос работает -

hive> select cast(12345*10000000000 as bigint);
OK
123450000000000
Time taken: 0.017 seconds, Fetched: 1 row(s)
hive> select cast(12345*1000 as bigint);
OK
12345000
Time taken: 0.025 seconds, Fetched: 1 row(s)
hive> select cast(12345*10000 as bigint);
OK
123450000
Time taken: 0.035 seconds, Fetched: 1 row(s)
hive> select cast(12345*100000 as bigint);
OK
1234500000
Time taken: 0.247 seconds, Fetched: 1 row(s)

1 Ответ

1 голос
/ 10 февраля 2020

Как объясняет документация :

Интегральные литералы по умолчанию считаются INT, если только число не превышает диапазон INT, и в этом случае оно интерпретируется как BIGINT или если на числе присутствует один из следующих постфиксов.

В этом выражении:

cast(12345*1000000 as bigint)

Результат 12345*1000000 приводится как bigint. Это не означает, что умножение выполняется с использованием этого типа. Для этого вам нужно разыграть до умножения :

12345 * cast(1000000 as bigint)

Или вы можете использовать суффиксы:

12345L * 1000000L

Обратите внимание, что явное cast() не является требуется, потому что значения уже bigint.

...