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