cta

xzabzqsa  于 2021-06-26  发布在  Hive
关注(0)|答案(3)|浏览(564)

我想将包含文本格式的现有表更改为orc格式。我可以这样做:(1)手动创建一个orc格式的表,包含分区,然后(2)使用insert overwrite语句填充该表。
我正在尝试使用CTA(创建表。。。作为选择…)语句。有没有什么方法可以将动态分区包含在ctas语句中?所以,如果我的文本数据集有多个分区(例如:年和月),我可以直接在ctas语句中指出它吗?
格式可能如下:

CREATE TABLE TEST_TABLE
STORED AS ORC
WITH PARTITION(year, month)
LOCATION '/<my_location>'
tblproperties ("orc.compress"="SNAPPY")
AS SELECT * FROM <existing_table>;

有什么想法吗?
注意:我对ctas语句感兴趣的原因是:使用这个语句,我实际上不需要指出每个列的名称。但是,如果我创建一个基于orc的表,然后手动填充它,那么在创建表时必须指示所有列。这没关系;但是,如果我现有的表包含很多列,这不是一个好主意。

h22fl7wq

h22fl7wq1#

其他答案都是正确的:你可以做 CREATE TABLE dest LIKE src; 如果您有一个完全符合您需要的表,但是您当前无法执行真正的动态cta来从变量字段创建分区表。
此功能已添加到即将推出的spark 3.0中:https://issues.apache.org/jira/browse/spark-26435

ie3xauqp

ie3xauqp2#

不支持

hive> create table t partitioned by (p int) as select 1 as i;

失败:semanticexception[错误10068]:
create table as select不支持在目标表中进行分区

9rygscc1

9rygscc13#

两个步骤:

CREATE TABLE target_table_name LIKE source_table_name;

INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name)
SELECT * FROM source_table_name;

其余存储为orc,您可以根据方便添加位置并通过配置单元查询支持。
对于外部表,这些步骤不起作用。问题是,数据在hdfs上的指定目录中更新,但当我们选择表时,我们看不到表中反映的更改。为此,您可以执行以下步骤:
解决方案1:检查表元数据是否更新。
解决方案2:如果解决方案1不起作用,则:

CREATE TABLE target_table_name LIKE source_table_name;

INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name) 
  SELECT * FROM source_table_name;

CREATE EXTERNAL TABLE another_table_name LIKE source_table_name 
  STORED AS file_format_of_source_table 
  LOCATION 'location_of_source_table';

把table修好

MSCK REPAIR TABLE another_table;

然后可以删除源表并重命名 another_tablesource_table_name .

相关问题