1

我正在制作一些自动流程来在 Cloudera Hive 上创建表。

为此,我正在使用show create table我给出(例如)以下 ddl 的语句:

CREATE TABLE clsd_core.factual_player (   player_name STRING,   number_goals INT ) PARTITIONED BY (   player_name STRING ) WITH SERDEPROPERTIES ('serialization.format'='1') STORED AS PARQUET LOCATION 'hdfs://nameservice1/factual_player'

我需要的是在不同的地方运行 ddl 来创建一个同名的表。

但是,当我运行该代码时,我返回以下错误:

Error while compiling statement: FAILED: ParseException line 1:123 missing EOF at 'WITH' near ')'

我手动删除了这部分“WITH SERDEPROPERTIES ('serialization.format'='1')”,它能够成功创建表。

有没有更好的函数来检索没有 SERDE 信息的表 ddls?

4

1 回答 1

0

DDL 中的第一个问题是分区列不应列在列规范中,而应仅列在partitioned by. 分区是有名字的文件夹,partition_column=value此列不存储在表文件中,仅存储在分区目录中。如果您希望分区列位于数据文件中,则应以不同的方式命名。

第二个问题是 SERDEPROPERTIES 是 SERDE 规范的一部分,如果不指定 SERDE,则应该没有 SERDEPROPERTIES。请参阅本手册:StorageFormat 和 SerDe

固定 DDL:

 CREATE TABLE factual_player (number_goals INT) 
 PARTITIONED BY (player_name STRING) 
 STORED AS PARQUET
 LOCATION 'hdfs://nameservice1/factual_player';

STORED AS PARQUET已经暗示SERDEINPUTFORMATOUPPUTFORMAT

如果要使用其属性指定 SERDE,请使用以下语法:

CREATE TABLE factual_player(number_goals int)
PARTITIONED BY (player_name string)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
WITH SERDEPROPERTIES ('serialization.format'='1') --I believe you really do not need this
STORED AS INPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat'
LOCATION 'hdfs://nameservice1/factual_player'
于 2020-02-26T11:02:17.323 回答