Как сделать так, чтобы результат запроса разделялся на вход?

Я новичок в улье, поэтому основной вопрос: как мне создать запрос, чтобы результат этого запроса был разделен определенным образом?

Например:

CREATE TABLE IF NOT EXISTS tbl_x (
 x SMALLINT,
 y FLOAT)
PARTITIONED BY (id SMALLINT)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
STORED AS ORC;

INSERT INTO TABLE `tbl_x` 
VALUES (1, 1, 1.0),
       (1, 1, 2.0),
       (1, 2, 3.0),
       (1, 2, 4.0),
       (2, 1, 5.0),
       (2, 1, 6.0),
       (2, 2, 7.0),
       (2, 2, 8.0);

CREATE TABLE tbl_y AS SELECT `id`, `x`, SUM(`y`) AS `y_sum`
FROM `tbl_x`
GROUP BY `id`, `x`;

В этом примере я бы хотел, чтобы tbl_y тоже был разделен.

Попытка этого не работает:

CREATE TABLE tbl_y AS SELECT `id`, `x`, SUM(`y`) AS `y_sum`
FROM `tbl_x`
GROUP BY `id`, `x` PARTITIONED BY (id SMALLINT);  

В чем здесь хитрость? Должен ли я сначала определить секционированную таблицу и вставить результаты?


person Leo Barlach    schedule 04.04.2019    source источник
comment
Возможный дубликат CTAS с динамическим разделом   -  person Pushkr    schedule 05.04.2019


Ответы (1)


Да, вы должны создать секционированную таблицу отдельно. Создание секционированной таблицы как выбор (CTAS) не поддерживается.

CREATE TABLE tbl_y(x smallint,y_sum double)
partitioned by (id smallint)
STORED AS ORC;

Если схема таблицы такая же, вы можете использовать ПОСТАВЬТЕ НРАВИТСЯ:

CREATE TABLE tbl_y like tbl_x;

Вы также можете использовать DISTRIBUTE BY для равномерного распределения данных между редукторами, см. также этот ответ: https://stackoverflow.com/a/38475807/2700344

insert overwrite table tbl_y partition(id)
select id, x, SUM(y) AS y_sum
fromtbl_x
group by id, x 
distribute by id, FLOOR(RAND()*100.0)%20;
person leftjoin    schedule 05.04.2019
comment
Спасибо. Я думаю, что в бите DISTRIBUTE есть опечатка, поскольку вы добавили его дважды. Я также получил эту ошибку: Completed executing command(queryId=hive_20190405103559_37aabd69-88dc-4137-8289-aa35357e1385); Time taken: 25.555 seconds Error: Error while processing statement: FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.StatsTask (state=08S01,code=1) - person Leo Barlach; 05.04.2019
comment
@LeoBarlach Это неинформативно. Копать журналы отслеживания заданий для неисправного контейнера. - person leftjoin; 05.04.2019