【问题标题】:Impala create parquet table with partition from existing Kudu tableImpala 使用现有 Kudu 表的分区创建镶木地板表
【发布时间】:2020-07-20 02:18:23
【问题描述】:

我正在尝试从 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

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

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

【问题讨论】:

    标签: parquet create-table partition hue kudu


    【解决方案1】:

    你可以尝试加载数据

    静态分区

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

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

    【讨论】:

    • 感谢Chema的详细解答!我尝试运行 CREATE TABLE 语句,但出现错误提示 AnalysisException: Table requires at least 1 column
    • 嗨@mongotop,您必须在create table 中放置不属于分区列的字段。例如CREATE TABLE IF NOT EXISTS kudu_parquet( name STRING) PARTITIONED BY (year SMALLINT, month TINYINT, day TINYINT) STORED AS PARQUET;
    • 我在帖子中做了一些更改以澄清答案。
    • 感谢@chema 的澄清!我希望我不必为 parquet 表指定列名,这样我的用户只需创建他们的 Kudu 表,我就可以自动为他们创建 parquet 表。就像从 Kudu 继承的某种列。如果不可能,我认为这将是一个很棒的功能,可以添加以确保一致性,并在创建 UNION Kudu 和 parquet 表的视图时避免任何用户错误。数据类型错误、列名错误、列顺序错误等。
    • 嗨@mongotop,这很有趣````这将是一个很棒的功能,可以确保一致性````,我也这么认为。如果这篇文章有用,请接受解决方案并点赞,我将不胜感激。
    猜你喜欢
    • 2017-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-24
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多