如何使查询结果作为输入进行分区?

gtlvzcf8  于 2021-06-24  发布在  Hive
关注(0)|答案(1)|浏览(382)

我是hive的新手,所以一个基本的问题是:如何创建一个查询,以便以特定的方式对该查询的结果进行分区?
例如:

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);

这里有什么诀窍?我是否应该先定义分区表并将结果插入?

xesrikrc

xesrikrc1#

是的,您应该单独创建一个分区表。不支持按选择方式创建分区表(ctas)。

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

如果表架构相同,则可以使用create like:

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;

相关问题