带有 USING 和 PARTITIONED BY 子句的 spark hive 创建表的有效语法是啥?

Posted

技术标签:

【中文标题】带有 USING 和 PARTITIONED BY 子句的 spark hive 创建表的有效语法是啥?【英文标题】:What is valid syntax for spark hive create table with USING and PARTITIONED BY clauses?带有 USING 和 PARTITIONED BY 子句的 spark hive 创建表的有效语法是什么? 【发布时间】:2019-08-28 15:09:08 【问题描述】:

我正在尝试创建 orc 格式的配置单元表,并将以下命令传递给SparkSesssion.sql(...)

CREATE TABLE `db`.`table`(
_id                     string,
...
)
PARTITIONED BY (load_date string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat'
USING ORC

得到像mismatched input 'USING' expecting <EOF>这样的异常 更改上述条款的位置没有帮助。

Official documentation 省略了这部分,或者至少我找不到它。

正确的做法是什么?

【问题讨论】:

没有使用。这是错误的。 @Lamanus 是 Spark 语法吗? 是的,它是蜂巢查询。 sql 有 spark 语法吗?我不这么认为。 spark.sql('create table db.table(id, string) stored as orc') 将使用您指定的所有上述格式。 @samkart 很好,我已经尝试过了,它在执行df.write.mode(SaveMode.Append).format("orc").saveAsTable("db.table") 时导致The format of the existing table db.table is HiveFileFormat. It doesn't match the specified format OrcFileFormat 【参考方案1】:

hive DDL 语句中没有 USING 标签:

你需要使用存储为ORC或者只是输入输出格式

CREATE TABLE `db`.`table`(
_id                     string,
...
)
PARTITIONED BY (load_date string)
STORED AS ORC

【讨论】:

谢谢你,我已经尝试过了,它在执行df.write.mode(SaveMode.Append).format("orc").saveAsTable("db.table") 时导致异常消息The format of the existing table db.table is HiveFileFormat. It doesn't match the specified format OrcFileFormat 如果您正在运行 saveAsTable 那么您之前不应该创建表。如果你已经创建了一个 ORC 表,那么跳过 saveAsTable 和格式部分,直接写。 你的意思是使用insertInto?正如我所见,它忽略了列的顺序,因此不适用于我的用例 您也可以插入,但您可以根据目标表预先配置列的顺序,然后进行写入。类似的东西: df.select("col1","col2").write.mode()

以上是关于带有 USING 和 PARTITIONED BY 子句的 spark hive 创建表的有效语法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Hive PARTITIONED BY,列表索引超出范围错误?

hive查询分区元数据,PARTITIONED BY

Partitioned by 给我创建外部表时重复的错误列

hive创建表的时候没有partitioned by能否在创表之后添加分区

如何在“PARTITIONED BY”子句的括号之间以逗号分隔的tick中提取值

下面这句话中“using”替换为“by using”后有语法错误吗?