Impala/Hive 将分区的 parquet 文件公开为 table

Impala/Hive expose partitioned parquet files as table

我已经使用 df.to_parquet(path="...", partition_cols="period") 将数据帧写入 HDFS (Cloudera CDH) 上的镶木地板文件。这工作正常,创建了一个子文件夹结构(period=YYYYMMDD),当我读取单个镶木地板文件时,它们包含预期的数据(正如预期的那样,它们不包含 period 列,因为它被分区了)。我现在正在尝试使用 Impala/Hive.

创建一个 table
CREATE EXTERNAL TABLE lab.tablename
LIKE PARQUET '/data/.../db/tablename/period=20200101/dhfjksdhdsakjdhjk.parquet'
PARTITIONED BY (period INT)
STORED AS PARQUET
LOCATION '/data/.../db/tablename'

起初,它似乎有效。 table 出现在数据库中,列被正确列出, period 键甚至被列为分区键。然而

select * from lab.tablename
>>  Done. 0 results.

不知何故 Impala 似乎没有正确设置引用。我也试过:

COMPUTE STATS lab.tablename
>> Updated 0 partition(s) and 2 column(s).

检查时得到 0 行

SHOW TABLE STATS lab.tablename

如果我以非分区方式写入相同的数据,它工作正常。

即使您使用了正确的文件夹,Hive 也不知道 Metastore 中的分区。 使用:

MSCK REPAIR TABLE lab.tablename

并且它应该发现丢失的分区并将它们添加到 Metastore。

Impala:运行 此命令会获取更改:

INVALIDATE METADATA lab.tablename

Good Read如果你想要更详细的解释。