我可以通过/bucket对通过hive中的“create table as select…”创建的表进行集群吗?

1szpjjfi  于 2021-06-04  发布在  Hadoop
关注(0)|答案(4)|浏览(423)

我正在尝试在配置单元中创建表

CREATE TABLE BUCKET_TABLE AS 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll
CLUSTERED BY (key) INTO 1000 BUCKETS;

这种语法是失败的-但我不确定是否有可能做这个组合语句。有什么想法吗?

9rnv2umw

9rnv2umw1#

创建表bucket\u table as select a.*from table1 a left join table2 b on(a.key=b.key),其中b.key为空;
将表bucket\u按(键)聚集的表改为64个bucket;
insert overwrite table bucket\ U table select a.*from table1 a left join table2 b on(a.key=b.key),其中b.key为null;
希望对你有帮助。无需将事务属性添加到true(出现在第一个注解中),因为当我们需要启用acid属性时,事务属性需要设置为true,并且需要存在bucketing和orc格式。

xqkwcwgp

xqkwcwgp2#

必须在clustered by子句中使用非空列。

6tr1vspr

6tr1vspr3#

看来这是不可能的。尝试向ambari提交此类查询时:

CREATE TABLE ready_requests 
CLUSTERED BY (device) INTO 64 BUCKETS
as
SELECT ...;

我得到了这样的消息:“createtableasselect不支持在目标表中分区”,即使它不是正确的消息,看起来bucketing也不受支持
有文档表明分区不受支持,请参阅链接,对于bucket没有这样的信息,但是看起来我们有同样的问题

jfgube3f

jfgube3f4#

遇到这个问题,发现没有答案。我进一步查看,在hive文档中找到了答案。
由于CTA的以下限制,这将永远不会起作用:
目标表不能是分区表。
目标表不能是外部表。
目标表不能是列表列表列表。
资料来源:https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#languagemanualddl-CreateTableAssetSelect%28ctas
此外https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl
创建[temporary][external]表[如果不存在][db\u name.]表\u name
...
[按(col_name,col_name,…)[按(col_name[asc | desc],…)]排序到num_bucket中]
...
[作为select_语句];
集群需要定义列,然后cfg转到as select\语句,因此此时不可能。
或者,您可以更改表并添加bucket,但这不会更改现有数据。

CREATE TABLE BUCKET_TABLE 
STORED AS ORC AS 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll limit 0;
ALTER TABLE BUCKET_TABLE CLUSTERED BY (key) INTO 1000 BUCKETS;
ALTER TABLE BUCKET_TABLE SET TBLPROPERTIES ('transactional'='true');
INSERT INTO BUCKET_TABLE 
SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NUll;

相关问题