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