我可以通过/ bucket在Hive中通过“CREATE TABLE AS SELECT ...”创建一个表吗?

问题描述 投票:6回答:4

我想在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;

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

hadoop hive hiveql bucket hadoop-partitioning
4个回答
14
投票

遇到这个问题,看到没有提供答案。我进一步观察并在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;

0
投票

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

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

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

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


0
投票
  • CREATE TABLE BUCKET_TABLE作为SELECT a。* FROM TABLE1 a LEFT JOIN TABLE2 b ON(a.key = b.key)WHERE b.key IS NUll;
  • 将表bucket_table由(key)聚类为64个桶;
  • 插入覆盖表bucket_table SELECT a。* FROM TABLE1 a LEFT JOIN TABLE2 b ON(a.key = b.key)WHERE b.key IS NUll;

希望它能帮到你。无需将事务属性添加到true(存在于第一个注释中),因为当我们需要启用ACID属性并且需要存在bucketing和orc格式时,需要将TRANSACTION Properties设置为true。


-1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.