Соединитель Spark Warehouse дает неверные результаты для типа данных Decimal из улья - PullRequest
0 голосов
/ 18 февраля 2020

Мы наблюдаем некоторые некорректные действия в том, как соединитель хранилища искрового улья извлекает данные из улья, когда тип данных куста определен как десятичный.

Мы подозревали, что проблема связана с десятичной точностью, но подтвердили, что проблема сохраняется даже для десятичных типов (18,0) и ниже

Мы отмечаем, что векторизация улья влияет на и подтвердили, что когда векторизация кустов отключена, мы можем извлечь правильные результаты из улья через соединитель хранилища кустов.

Может ли кто-нибудь пролить свет на эту еще недокументированную ошибку в производительности spark-hwx.

См. Ниже для быстрой демонстрации.:

определить данные в кусте:

0: jdbc:hive2://xxxxxx-worker02.xxxxxxxx.az> create table test_decimal (id string, value decimal(32,0));
0: jdbc:hive2://xxxxx-worker02.xxxxxxx.az> insert into test_decimal values ('a1', 1), ('b1', 2),('c1', 3),('a2', 1),('b2', 2),('c2', 3),('a3', 1),('b3', 2),('c3', 3);

0: jdbc:hive2://xxxxx-worker02.xxxxxx.az> select * from test_decimal;

+------------------------+---------------------------+
| test_decimal.id  | test_decimal.value  |
+------------------------+---------------------------+
| a1                     | 1                         |
| b1                     | 2                         |
| c1                     | 3                         |
| a2                     | 1                         |
| b2                     | 2                         |
| c2                     | 3                         |
| a3                     | 1                         |
| b3                     | 2                         |
| c3                     | 3                         |
+------------------------+---------------------------+

0: jdbc:hive2://xxxx-worker02.xxxxxxx.az> select * from test_decimal where value in (2,3)

+------------------------+---------------------------+
| test_decimal.id  | test_decimal.value  |
+------------------------+---------------------------+
| b1                     | 2                         |
| c1                     | 3                         |
| b2                     | 2                         |
| c2                     | 3                         |
| b3                     | 2                         |
| c3                     | 3                         |
+------------------------+---------------------------+

Теперь запрос с соединителем хранилища Hive в сеансе pyspark. В поле значения отображаются неправильные результаты, но возвращаются правильные записи идентификаторов.

>>> from pyspark_llap import HiveWarehouseSession
>>> hive = HiveWarehouseSession.session(spark).build()
>>> hive.executeQuery('select * from test_decimal where value in (2,3)').show()
20/02/18 17:00:43 WARN TaskSetManager: Stage 2 contains a task of very large size (457 KB). The maximum recommended task size is 100 KB.
+---+-----+                                                                     
| id|value|
+---+-----+
| b1|    1|
| c1|    2|
| b2|    3|
| c2|    1|
| b3|    2|
| c3|    3|
+---+-----+

еще один пример в pyspark

, показывающий запрос в поле идентификатора, но снова значение поля зашифровано.

>>> hive.executeQuery('select * from test_decimal where id in ("b1", "b2")').show()
20/02/18 17:02:33 WARN TaskSetManager: Stage 3 contains a task of very large size (457 KB). The maximum recommended task size is 100 KB.
+---+-----+
| id|value|
+---+-----+
| b1|    1|
| b2|    2|
+---+-----+

другой пример с простым предложением where, не содержащим 'OR'

Еще раз у нас есть ложные записи в столбце значений.

>>> hive.executeQuery('select * from test_decimal where value == 2 ').show()
20/02/18 18:56:12 WARN TaskSetManager: Stage 39 contains a task of very large size (459 KB). The maximum recommended task size is 100 KB.
+---+-----+
| id|value|
+---+-----+
| b1|    2|
| b2|    0|
| b3|    0|
+---+-----+


## showing full table scan...  no issues 

>>> hive.executeQuery('select * from test_decimal').show()
20/02/18 18:56:35 WARN TaskSetManager: Stage 40 contains a task of very large size (453 KB). The maximum recommended task size is 100 KB.
+---+-----+
| id|value|
+---+-----+
| a1|    1|
| b1|    2|
| c1|    3|
| a2|    1|
| b2|    2|
| c2|    3|
| a3|    1|
| b3|    2|
| c3|    3|
+---+-----+

### showing schema

>>> hive.executeQuery('select * from test_decimal').printSchema()
root
 |-- id: string (nullable = true)
 |-- value: decimal(32,0) (nullable = true)

>>> 

Дополнительная информация

версия искры

>>> sc.version
u'2.3.2.3.1.4.0-315'

версия улья

[xxxxx@xxxxx-edge01 ~]$ hive --version
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hdp/3.1.4.0-315/hive/lib/log4j-slf4j-impl-2.10.0.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/3.1.4.0-315/hadoop/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See <a href="http://www.slf4j.org/codes.html#multiple_bindings" target="_blank">http://www.slf4j.org/codes.html#multiple_bindings</a> for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Hive 3.1.0.3.1.4.0-315
Git git://ctr-e139-1542663976389-113618-01-000003.hwx.site/grid/0/jenkins/workspace/HDP-parallel-centos7/SOURCES/hive -r e8d79f440455fa4400daf79974666b3055f1730f
Compiled by jenkins on Fri Aug 23 05:16:38 UTC 2019
From source with checksum 0321d07fd607c216351462c714d08b6a
[xxxxxx@xxxxxx-edge01 ~]$ 

версия HWX

/usr/hdp/3.1.4.0-315/hive_warehouse_connector/hive-warehouse-connector-assembly-1.0.0.3.1.4.0-315.jar
...