我可以通过&桶对通过" CREATE TABLE AS SELECT .....创建的表进行聚类。在蜂巢?

时间:2014-07-22 20:41:14

标签: hadoop hive hiveql bucket hadoop-partitioning

我正在尝试在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 个答案:

答案 0 :(得分:13)

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

由于以下对CTAS的限制,这将永远不会起作用:

  1. 目标表不能是分区表。
  2. 目标表不能是外部表。
  3. 目标表不能是列表存储表。
  4. 来源: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;
    

答案 1 :(得分:0)

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

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

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

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

答案 2 :(得分:0)

  • 创建表BUCKET_TABLE AS 从表1中选择a。* a左联接表2 b在(a.key = b.key)打开的情况下b.key是空的;
  • 通过(key)将更改表bucket_table聚集到64个存储桶中;
  • 插入覆盖表bucket_table SELECT a。*从TABLE1 a左联接TABLE2 b开启(a.key = b.key),其中b.key是NUll;

希望它对您有帮助。无需将事务属性添加为true(在第一个注释中显示),因为当我们需要启用ACID属性并且需要存在存储区和orc格式时,需要将TRANSACTION Properties设置为true。

答案 3 :(得分:-1)

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