куст не использует раздел для выбора данных во внешней таблице - PullRequest
0 голосов
/ 24 января 2019

Странное поведение я никогда не видел.

A содержит файлы паркетных дисков в моей HDFS, сгенерированные Spark, разбитые на 3 раздела.

Вот количество всех разделов.Он был рассчитан по Spark .

+----------+--------+
|created_at|count(1)|
+----------+--------+
|  20190101|12774895|
|  20181231|18648432|
|  20190102|30010065|
+----------+--------+

Всего: 61433392 записей

Улей

Создана таблица.

CREATE EXTERNAL TABLE raw.event (
    account_type STRING,
    event_name STRING,
    payload MAP<STRING, STRING>
)
PARTITIONED BY(created_at INT, product_name STRING, event_type STRING)
STORED AS PARQUET LOCATION '/datalake/raw/event'
TBLPROPERTIES('PARQUET.COMPRESS'='SNAPPY');

Добавлены все разделы.

Показать разделы raw.event;

+---------------------------------------------------------------------+--+
|                              partition                              |
+---------------------------------------------------------------------+--+
| created_at=20181231/product_name=A/event_type=X  |
| created_at=20190101/product_name=A/event_type=X  |
| created_at=20190102/product_name=A/event_type=X  |
+---------------------------------------------------------------------+--+

Выполните полный подсчет, чтобы убедиться, что все работает гладко:

0: jdbc: hive2: // headnodehost: 10001 /> select count (*) из raw.event;

+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+

Ожидаемый результат!ОК:)

Теперь считайте только с одного раздела.

0: jdbc: hive2: // headnodehost: 10001 /> выберите количество (*) из raw.event, где созданный_кат =20190102 и product_name = 'A' и event_type = 'X';

Вместо этого получите ожидаемое число строк 12774895 Я все еще получаю полный счет.

+-----------+--+
|    _c0    |
+-----------+--+
| 61433392  |
+-----------+--+

Теперь я пытаюсь сосчитать и сгруппировать по разделу made_at .

0: jdbc: hive2: // headnodehost: 10001 /> SELECT созданный_at, count (*) FROM raw.event group by creat_at;

+-------------+-----------+--+
| created_at  |    _c1    |
+-------------+-----------+--+
| 20190102    | 61433392  |
+-------------+-----------+--+

Я все еще получаю полное количество строк и только последний добавленный раздел.

Я почти уверен, что паркетфайлы содержат различные значения create_at .

Избегайте использования статистики, также не помогает.

set hive.compute.query.using.stats=false;

Анализ таблицы также не помогает:

0: jdbc: hive2: // headnodehost: 10001 /> ANALYZE TABLE raw.event PARTITION (созданный_каталог_имя_продукта, тип_ события) КОМПЬЮТЕРНАЯ СТАТИСТИКА;

INFO  : Partition raw.event{created_at=20181231, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]
INFO  : Partition raw.event{created_at=20190101, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]
INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=0, totalSize=19637211108, rawDataSize=0]

Форцинga раздел дает тот же результат.

0: jdbc: hive2: // headnodehost: 10001 /> ANALYZE TABLE raw.event PARTITION (create_at = 20190102, product_name, event_type) COMPUTE STATISTICS;

INFO  : Partition raw.event{created_at=20190102, product_name=A, event_type=X} stats: [numFiles=111, numRows=**61433392**, totalSize=19637211108, rawDataSize=1965868544]

Есть предложения?

1 Ответ

0 голосов
/ 24 января 2019

Это, вероятно, связано с тем, как вы добавили разделы. Похоже, что все ваши данные находятся в одном каталоге в HDFS. Разделы указывают на определенное местоположение в hdf (не на несколько мест), поэтому я предположил бы, что 1 раздел указывает на весь набор данных. Вы можете выполнить следующую команду, чтобы проверить расположение раздела

describe formatted raw.event  partition ( created_at=20181231,product_name="A",event_type="X");

Кроме того, разделы не зависят от самих данных или даже каталог, местоположение и значение зависят от того, как вы добавили их в таблицу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...