hive - 如何将查询结果分区为输入?
问题描述
我是 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;
如果表架构相同,则可以使用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;
推荐阅读
- javascript - Uncaught (in promise) TypeError: Cannot read property 'forEach' of undefined (JavaScript)
- python - 如何让每个线程从我的 txt 文件中逐行使用下一个用户代理
- unity3d - 为什么这个计算着色器会跳过每 17 个缓冲区值?
- python - Twitter API created_at 字段值“行为有趣”
- processing - p5.js 从 createCapture() 提要中提取图像
- octave - 构建八度音程通常需要多少内存?
- python - 如何为接受 csv 文件的函数编写单元测试?
- ios - 有没有办法使用 IOS 设备扫描产品的条形码并获取产品的输入(例如可口可乐、薯片袋……)
- sql - Oracle APEX 错误 ora-01403:无法编辑报告
- python - Python 和 lmfit:如何绘制通过最小化函数的残差获得的多重拟合