我正在尝试在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;
这种语法失败了 - 但我不确定是否可以执行此组合语句。有任何想法吗?
答案 0 :(得分:13)
遇到这个问题,看到没有提供答案。我进一步观察并在Hive文档中找到答案。
由于以下对CTAS的限制,这将永远不会起作用:
此外 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;
答案 1 :(得分:0)
看起来不可能。在尝试向ambari提交此类查询时:
CREATE TABLE ready_requests
CLUSTERED BY (device) INTO 64 BUCKETS
as
SELECT ...;
我有类似的东西: “ CREATE-TABLE-AS-SELECT不支持在目标表中进行分区” 即使是不正确的消息,看起来也不支持分组
有文档说明不支持分区,请参阅 link,对于存储桶,没有这样的信息,但看起来我们遇到了同样的问题
答案 2 :(得分:0)
希望它对您有帮助。无需将事务属性添加为true(在第一个注释中显示),因为当我们需要启用ACID属性并且需要存在存储区和orc格式时,需要将TRANSACTION Properties设置为true。
答案 3 :(得分:-1)
您必须在clustered by子句中使用非空列。