我正在尝试使用Impala中现有Kudu表中的分区创建镶木地板表,而不必再次指定数据类型的列。
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
但是,当我尝试创建不带分区的拼花地板时,它可以使用:
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
您可以尝试使用加载数据
静态分区
将数据加载到分区表中的一种方法是使用静态分区,您可以在其中手动定义不同的分区。(另一种方法是在加载数据时自动定义分区,这称为动态分区。)
对于静态分区,您可以使用一条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
命令。但是无论加载数据如何,都必须小心确保数据存储在正确的分区子目录中。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句