我可以在 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 .....”创建的表进行集群吗?的主要内容,如果未能解决你的问题,请参考以下文章
在新的 create-react-app 项目中通过“as”关键字键入断言会导致“解析错误:意外的令牌,预期的“;”`
如何在 Spark 1.3 中通过 Hive 指示 SparkSQL 中的数据库