我可以在 Hive 中通过/存储通过“CREATE TABLE AS SELECT .....”创建的表进行集群吗?

Posted

技术标签:

【中文标题】我可以在 Hive 中通过/存储通过“CREATE TABLE AS SELECT .....”创建的表进行集群吗?【英文标题】:Can I cluster by/bucket a table created via "CREATE TABLE AS SELECT....." in Hive? 【发布时间】:2014-09-13 20:46:39 【问题描述】:

我正在尝试在 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;

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

【问题讨论】:

try CREATE TABLE BUCKET_TABLE CLUSTERED BY (key) INTO 1000 Bucket AS SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key 为 NULL ; @patrick 它抛出错误 FAILED: SemanticException [Error 10068]: CREATE-TABLE-AS-SELECT 不支持目标表中的分区..你试过了吗? 【参考方案1】:

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

这永远不会奏效,因为 CTAS 存在以下限制:

    目标表不能是分区表。 目标表不能是外部表。 目标表不能是列表分桶表。

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

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

创建 [TEMPORARY] [EXTERNAL] 表 [如果不存在] [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;

【讨论】:

可惜Hive 不支持它,因为Cloudera Impala does it【参考方案2】:

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

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

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

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

【讨论】:

【参考方案3】: 创建表 BUCKET_TABLE 为 SELECT a.* FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) WHERE b.key IS 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。

【讨论】:

【参考方案4】:

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

【讨论】:

这给了我同样的语法错误(失败:ParseException 行 1:235 在 'NULL' 附近的 'clustered' 处缺少 EOF (state=42000,code=40000)) @Andrew 这对您不起作用,因为您从 table1 中选择键为空的行,然后在这些空键上使用 clustered by。 Clustered by 应该在非空列上运行。 不,查询中的 table1 键不为空。 table2 键是。 但您似乎正在尝试提取所有键为空的记录。 1.请尝试将 NUll 更改为 NULL 2. 尝试此查询 FROM TABLE1 a LEFT JOIN TABLE2 b ON (a.key=b.key) INSERT OVERWRITE TABLE BUCKET_TABLE SELECT a.* WHERE b.key IS NULL CLUSTERED BY (key) INTO 1000桶;

以上是关于我可以在 Hive 中通过/存储通过“CREATE TABLE AS SELECT .....”创建的表进行集群吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何通过在 PHP 中通过引用传递变量来存储变量?

在PHP中通过TCP发送XML EPP请求

在新的 create-react-app 项目中通过“as”关键字键入断言会导致“解析错误:意外的令牌,预期的“;”`

如何在 Spark 1.3 中通过 Hive 指示 SparkSQL 中的数据库

在新门户中通过 powershell 创建 azure 存储容器

如何在 Jenkins 中通过 *** 拉取/克隆 git 存储库?