创建表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格式。
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;
4条答案
按热度按时间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格式。
xqkwcwgp2#
必须在clustered by子句中使用非空列。
6tr1vspr3#
看来这是不可能的。尝试向ambari提交此类查询时:
我得到了这样的消息:“createtableasselect不支持在目标表中分区”,即使它不是正确的消息,看起来bucketing也不受支持
有文档表明分区不受支持,请参阅链接,对于bucket没有这样的信息,但是看起来我们有同样的问题
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,但这不会更改现有数据。