带动态分区的 CTAS
CTAS with Dynamic Partition
我想将包含文本格式的现有 table 更改为 orc 格式。我能够通过以下方式做到这一点:
(1) 手动创建一个包含分区的 orc 格式的 table,然后,
(2)使用INSERT OVERWRITE语句填充table.
我正尝试为此使用 CTAS (Create Table... AS Select...) 语句。
有什么办法可以将动态分区包含在 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 语句感兴趣的原因是:使用这个语句,我真的不需要指出每一列的名称。
但是如果我创建一个基于 table 的 orc 然后手动填充它,我必须在创建 table 时指明所有列。这没关系;但是,如果我现有的 table 包含很多列,那不是一个好主意。
不支持
hive> create table t partitioned by (p int) as select 1 as i;
FAILED: SemanticException [Error 10068]:
CREATE-TABLE-AS-SELECT does not support partitioning in the target table
两步:
CREATE TABLE target_table_name LIKE source_table_name;
INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name)
SELECT * FROM source_table_name;
Rest 存储为 ORC,您可以根据配置单元查询的方便和支持添加位置。
对于外部 table,这些步骤不起作用。问题是,数据在 HDFS 上的指定目录中更新,但是当我们执行 select table 时,我们看不到 table 中反映的更改。为此,您可以按照以下步骤操作:
解决方案一:
检查 table 的元数据是否更新。
方案二:
如果解决方案 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;
然后你可以删除 source_table 并将 another_table
重命名为 source_table_name
。
其他答案都是正确的:如果您有 table 正是您想要的,您可以执行 CREATE TABLE dest LIKE src;
,但您目前无法执行真正的动态 CTAS 来创建分区table 来自变量字段。
此功能已添加到即将推出的 Spark 3.0 中:https://issues.apache.org/jira/browse/SPARK-26435
我想将包含文本格式的现有 table 更改为 orc 格式。我能够通过以下方式做到这一点: (1) 手动创建一个包含分区的 orc 格式的 table,然后, (2)使用INSERT OVERWRITE语句填充table.
我正尝试为此使用 CTAS (Create Table... AS Select...) 语句。 有什么办法可以将动态分区包含在 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 语句感兴趣的原因是:使用这个语句,我真的不需要指出每一列的名称。 但是如果我创建一个基于 table 的 orc 然后手动填充它,我必须在创建 table 时指明所有列。这没关系;但是,如果我现有的 table 包含很多列,那不是一个好主意。
不支持
hive> create table t partitioned by (p int) as select 1 as i;
FAILED: SemanticException [Error 10068]:
CREATE-TABLE-AS-SELECT does not support partitioning in the target table
两步:
CREATE TABLE target_table_name LIKE source_table_name;
INSERT OVERWRITE TABLE target_table_name PARTITION(partition_column_name)
SELECT * FROM source_table_name;
Rest 存储为 ORC,您可以根据配置单元查询的方便和支持添加位置。
对于外部 table,这些步骤不起作用。问题是,数据在 HDFS 上的指定目录中更新,但是当我们执行 select table 时,我们看不到 table 中反映的更改。为此,您可以按照以下步骤操作:
解决方案一: 检查 table 的元数据是否更新。
方案二: 如果解决方案 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;
然后你可以删除 source_table 并将 another_table
重命名为 source_table_name
。
其他答案都是正确的:如果您有 table 正是您想要的,您可以执行 CREATE TABLE dest LIKE src;
,但您目前无法执行真正的动态 CTAS 来创建分区table 来自变量字段。
此功能已添加到即将推出的 Spark 3.0 中:https://issues.apache.org/jira/browse/SPARK-26435