hive - 如何将查询结果分区为输入?

标签 hive hiveql create-table hive-partitions hiveddl

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

这里有什么技巧?我应该先定义分区表并将结果插入其中吗?

最佳答案

是的,您应该单独创建一个分区表。不支持创建分区表作为选择(CTAS)。

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

如果表schema相同,可以使用CREATE LIKE :

CREATE TABLE tbl_y like tbl_x;

您还可以使用DISTRIBUTE BY在reducer之间均匀分配数据,另请参阅此答案: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;

关于hive - 如何将查询结果分区为输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55525974/

相关文章:

hadoop - 为什么 hive 不允许在 JOIN 子句中使用 >、>=,但您可以使用 JOIN ON IF(a > b, 1, 0) = 1 来绕过它?

sql - Hive表加入更新

sql - 如何获取配置单元中仅具有 NULL 值的所有列的列表?

hadoop - 剥离 Hive 中的空格

hadoop - 如何将一列附加到 Hive 中的现有数组列?

sql - 在 SQL Create 语句中添加命名外键约束

r - sparklyr 看不到在 Hive 中创建的数据库,反之亦然

Mysql表配置插入和选择不同语言

sql-server - 根据动态数据透视结果在 SQL Server 上创建表

sql-server - 当表处于不同模式时,如何从 SQL Server 导入所有带有 sqoop 的表?