在 ATHENA 中创建带有分区的外部表会导致空表

问题描述

我有一个带有按日期列分区的镶木地板的 s3 位置。

parquet_data ---
               --  dt=2021-07-27
                   files
               --  dt=2021-07-26
                   files

现在我想创建一个外部表(CETAS)

使用由 dt 列分区的表。

CREATE EXTERNAL TABLE IF NOT EXISTS database.tbl_name (
  ACCOUNT_NUM                             bigint,ID                                      bigint,NAME                                    string
)

PARTITIONED BY (
  dt date)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
STORED AS INPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.parquet.MapredParquetoutputFormat'
LOCATION
  's3://location/of/data/'
TBLPROPERTIES (
  'classification'='parquet','typeOfData'='file'
);

当我从这个新表中选择时,里面根本没有数据,只有标题

有什么我错过的地方吗?

我尝试过的东西。

  • 重新创建镶木地板
  • 创建没有分区的表 - 可以工作,但看不到分区并且无法在表 def 中添加 dt,它显示为空白。

解决方法

使用现有分区数据创建新表时,运行以下命令:

MSCK REPAIR TABLE database.tbl_name

来自MSCK REPAIR TABLE - Amazon Athena

MSCK REPAIR TABLE 命令扫描文件系统(例如 Amazon S3)以查找在创建表后添加到文件系统的 Hive 兼容分区。 MSCK REPAIR TABLE 比较表元数据中的分区和 S3 中的分区。如果您在创建表时指定的 S3 位置中存在新分区,则会将这些分区添加到元数据和 Athena 表中。

这是必需的,因为分区不是由 Amazon Athena 或 AWS Glue 创建的,因此它还不知道它们存在。