impala从现有kudu表创建带有分区的Parquet地板表

laawzig2  于 2021-06-21  发布在  Kudu
关注(0)|答案(1)|浏览(415)

我正在尝试从impala中现有的kudu表创建一个带有分区的parquet表,而不必再次使用数据类型重新指定列。

CREATE TABLE IF NOT EXISTS db_name.parquet_table
PARTITIONED BY (`year` SMALLINT, `month` TINYINT, `day` TINYINT)
STORED AS PARQUET 
As SELECT * FROM db_name.kudu_table limit 0

我收到一条错误消息说

ParseException: Syntax error in line 4:undefined: As SELECT * FROM db_name.parquet_table limit 0 ^ Encountered: AS Expected CAUSED BY: Exception: Syntax error

但是,当我尝试创建没有分区的Parquet地板表时,它可以使用:

CREATE TABLE IF NOT EXISTS db_name.parquet_table STORED AS PARQUET  
AS SELECT * FROM db_name.kudu_table LIMIT 0

但当我尝试使用以下方法添加分区时:

ALTER TABLE db_name.parquet_table ADD PARTITION(`year`=0,`month`=0,`day`=0)

我收到以下错误消息:

AnalysisException: Table is not partitioned: db_name.parquet_table
wvmv3b1j

wvmv3b1j1#

你可以试着用
静态分区
将数据加载到分区表的一种方法是使用静态分区,即手动定义不同的分区(另一种方法是在加载数据时自动定义分区,这称为动态分区。)
对于静态分区,您可以使用 ALTER TABLE … ADD PARTITION 语句,然后将数据加载到分区中。
以你为例,我想试试这个。
第一。创建分区表

CREATE TABLE IF NOT EXISTS db_name.parquet_table(field1 [TYPE],...,fieldN [TYPE]) --Fields that not belongs to the partitioned columns
PARTITIONED BY (year SMALLINT, month TINYINT, day TINYINT)
STORED AS PARQUET;

第二。 ALTER TABLE 语句来创建分区。

ALTER TABLE db_name.parquet_table ADD PARTITION(year = 0,month = 0,day = 0);

注意分区列名和定义这个分区的特定值是如何在 ADD PARTITION 条款。这将在表目录中创建分区目录。
创建分区后,可以使用 INSERT … SELECT 陈述

INSERT OVERWRITE TABLE db_name.parquet_table
    PARTITION(year = 0, month = 0, day = 0)
    SELECT field1,..., fieldn --do not include partitioned columns
    FROM db_name.kudu_table 
    WHERE year = 0 AND month = 0 AND day = 0;

对于静态分区,您需要为每个分区重复这两个步骤:首先创建分区,然后添加数据。实际上,您可以使用任何方法来加载数据;你不需要使用 INSERT 声明。你可以用 hdfs dfs 命令或 LOAD DATA INPATH 命令。但是,无论如何加载数据,都必须小心确保数据存储在正确的分区子目录中。

相关问题