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