Apache Hive:CREATE TABLE 没有模式的 parquet 语句可能无法推断分区列

Apache Hive: CREATE TABLE statement without schema over parquet can fail to infer partition column

我在以下路径有一个分区镶木地板:

/path/to/partitioned/parq/

分区如下:

/path/to/partitioned/parq/part_date=2021_01_01_01_01_01
/path/to/partitioned/parq/part_date=2021_01_02_01_01_01
/path/to/partitioned/parq/part_date=2021_01_03_01_01_01

当我 运行 一个 Spark SQL 创建 TABLE 语句时:

CREATE TABLE IF NOT EXISTS 
my_db.my_table
USING PARQUET 
LOCATION '/path/to/partitioned/parq'

分区列 part_date 出现在我的数据集中,但 DESCRIBE EXTENDED 表示没有分区。 SHOW PARTITIONS my_db.my_table 显示没有分区数据。

这似乎是间歇性发生的,就像有时 spark 会推断分区,有时则不会。这会导致下游出现问题,我们添加一个分区并尝试 MSCK REPAIR TABLE my_db.my_table,它说你不能 运行 在非分区表上。

我看到如果你确实声明了模式,你可以 FORCE 子句的 PARTITIONED BY 部分,但我们没有模式的奢侈,只有下面的文件。

为什么 spark 间歇性地无法从这种形状的镶木地板中确定分区列?

  • 不幸的是,对于 Hive,您需要指定模式,即使 parquet 显然有它自己。
  • 您需要在 DDL 中添加 partition by 子句。
  • 使用 ALTER table 语句分别添加每个分区和位置。