Impala 使用现有 Kudu table 的分区创建镶木地板 table

Impala create parquet table with partition from existing Kudu table

我正在尝试使用 Impala 中现有 Kudu table 的分区创建镶木地板 table,而无需再次重新指定数据类型的列。

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

但是当我尝试创建不带分区的镶木地板 table 时,它可以使用:

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

您可以尝试使用

加载数据

静态分区

将数据加载到分区 table 的一种方法是使用静态分区, 您在其中手动定义不同的分区。 (另一种方法是在加载数据时自动定义分区,这称为动态分区。)

对于静态分区,您可以使用 ALTER TABLE … ADD PARTITION 语句手动创建分区, 然后将数据加载到分区中。

以你的例子我会试试这个。

首先。创建分区 table

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 子句中指定的。 这会在 table 目录中创建一个分区目录。

创建分区后,可以使用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 命令。 但是无论如何加载数据,都必须小心确保数据存储在正确的分区子目录中。