8

我正在尝试在 Hive 中创建一个表

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;

此语法失败 - 但我不确定是否可以执行此组合语句。有任何想法吗?

4

4 回答 4

16

遇到这个问题,发现没有提供答案。我进一步查看并在 Hive 文档中找到了答案。

由于对 CTAS 的以下限制,这永远不会奏效:

  1. 目标表不能是分区表。
  2. 目标表不能是外部表。
  3. 目标表不能是列表分桶表。

来源:https ://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-CreateTableAsSelect%28CTAS

此外 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL

CREATE [TEMPORARY] [EXTERNAL] TABLE [IF NOT EXISTS] [db_name.]table_name
...
[CLUSTERED BY (col_name, col_name, ...) [SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]
...
[AS select_statement];

聚类需要定义列,然后 cfg 转到 As select_statement,因此目前不可能。

或者,您可以更改表并添加存储桶,但这不会更改现有数据。

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;
于 2017-08-01T12:39:30.420 回答
0
  • CREATE TABLE BUCKET_TABLE AS SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key 为 NULL;
  • 将按(key)聚类的表bucket_table更改为64个桶;
  • 插入覆盖表 bucket_table SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS NULL;

希望它可以帮助你。无需将事务属性添加到 true(在第一条评论中),因为当我们需要启用 ACID 属性并且需要存在分桶和 orc 格式时,需要将 TRANSACTION 属性设置为 true。

于 2019-04-24T11:49:31.290 回答
0

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

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

我得到了类似的东西:“ CREATE-TABLE-AS-SELECT 不支持目标表中的分区”即使它不是正确的消息,看起来也不支持分桶

有文档不支持分区,请参阅 链接,对于存储桶没有这样的信息,但看起来我们有同样的问题

于 2016-03-25T08:24:20.263 回答
-1

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

于 2014-07-22T20:50:41.723 回答