2016-03-22 4 views
0

Я делаю операцию присоединения в улье. Но когда редуктор достигает 99%, редуктор застревает.Как обрабатывать искаженные данные с помощью Hive?

Затем я определил, что в таблице есть данные перекоса. Пример. В таблице A имеется 1 миллион данных, а таблица B имеет только 10k. В таблице A столбец соединения имеет 80% значений, то же самое, а остальное - другое. Таким образом, редуктор улья застрял в этом значении.

Вот мой запрос:

INSERT INTO TABLE xyz SELECT m.name, m.country, m.user_type, m.category FROM A m JOIN category n ON (m.name = n.name) where country=2 GROUP BY m.name, m.country, m.user_type, m.category; 

Поэтому, пожалуйста, предложить возможные решения. Как я могу обработать операцию объединения данных такого типа.

+0

http://stackoverflow.com/questions/32370033/hive-join-optimization/32373086#32373086 –

+0

Спасибо @KishoreKumarSuthar за ответ. Его что-то круто. –

ответ

1

Начиная с Hive 0.10.0, таблицы могут быть созданы как перекошенные или измененные для перекоса (в этом случае разделы, созданные после инструкции ALTER, будут искажены). Кроме того, перекошенные таблицы могут использовать функцию балансировки списка, указав опцию STORED AS DIRECTORIES. Смотрите документацию DDL для деталей: Create Table, Skewed Tables и Alter Table Skewed or Stored as Directories

Для справки использования этого link.

+0

Спасибо за повтор, но я не могу следовать этому подходу для ежедневной обработки. –

0

Нашли некоторое решение для вышеуказанной проблемы.

Установить ниже параметров, чтобы улей перед выполнением улей присоединиться.

set hive.optimize.skewjoin=true; 
set hive.skewjoin.key=100000; 
set hive.skewjoin.mapjoin.map.tasks=10000; 
set hive.skewjoin.mapjoin.min.split=33554432; 
set hive.exec.parallel=true; 
set hive.exec.parallel.thread.number=8; 
set hive.vectorized.execution.enabled = true; 
set hive.vectorized.execution.reduce.enabled = true; 
set hive.vectorized.execution.reduce.groupby.enabled = true; 
set hive.cbo.enable=true; 
set hive.compute.query.using.stats=true; 
set hive.stats.fetch.partition.stats=true; 
set hive.stats.fetch.column.stats=true; 
set hive.stats.autogather=true; 
set mapred.output.compress=true; 
set hive.exec.compress.output=true; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.GzipCodec; 
set hive.auto.convert.join=false; 

Немного параметров необходимо изменить в зависимости от размера данных и размера кластера.

+0

Это помогло бы, если бы в этом ответе были ссылки на то, почему это сработало. Например, четыре параметра, по-видимому, включают оптимизацию на основе затрат: https://hortonworks.com/blog/5-ways-make-hive-queries-run-faster/ – dfrankow

Смежные вопросы