【问题标题】:How do I make it such that the result of a query is partitioned as the input?如何将查询结果分区为输入?
【发布时间】:2019-08-26 19:14:35
【问题描述】:

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

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

【问题讨论】:

标签: hive hiveql create-table hive-partitions hiveddl


【解决方案1】:

是的,您应该单独创建一个分区表。不支持创建分区表作为选择 (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在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;

【讨论】:

  • 谢谢。我认为 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)
  • @LeoBarlach 这不是信息。挖掘失败容器的作业跟踪器日志。
猜你喜欢
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2022-06-14
相关资源
最近更新 更多