【问题标题】:Tables missing on filesystem in AWS AthenaAWS Athena 中的文件系统上缺少表
【发布时间】:2019-08-07 13:41:12
【问题描述】:

我在 Athena 上使用此代码创建了一个具有自动分区功能的表。

CREATE EXTERNAL TABLE IF NOT EXISTS matchdata.stattable (
  `matchResult` string,
  ...
) PARTITIONED BY (
  year int ,
  month int,
  day int
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
WITH SERDEPROPERTIES (
  'serialization.format' = '1'
) LOCATION 's3://******/data/year=2019/month=8/day=2/'
TBLPROPERTIES ('has_encrypted_data'='false');

我运行了 MSCK REPAIR TABLE stattable,但文件系统上缺少表,查询结果是返回零记录。 matchdata.stattable 得到相同的结果。

另一个没有分区的表,查询工作正常。但是随着服务的继续和数据集的增长,我必须进行分区。

示例数据路径为 data/2019/8/2/1SxFHaUeHfesLtPs._BjDk.gz。我该如何解决这个问题?

【问题讨论】:

  • 我再次创建了一个位置为 's3://***/data/' 的表,但后来我得到了 分区不在 Metastore 中。我手动添加了一个分区并再次尝试,但使用 msck repair 自动分区不起作用。

标签: sql hive amazon-athena


【解决方案1】:

正如您所发现的(但对于有相同问题的人来说,有更多的上下文)MSCK REPAIR TABLE … 只了解 Hive 样式分区,例如/data/year=2019/month=08/day=10/file.json。该命令的真正作用是扫描 S3 上与表的 LOCATION 指令相对应的前缀,并查找看起来像这样的路径组件。

这只是MSCK REPAIR TABLE …的限制,您可以手动添加其他路径样式的分区,如下所示:

ALTER TABLE the_table ADD PARTITION (year = '2019', month = '08', day = '10') LOCATION 's3://some-bucket/data/2019/08/10/'

另见https://docs.aws.amazon.com/athena/latest/ug/alter-table-add-partition.html

我什至要说你应该完全避免使用MSCK REPAIR TABLE …。它很慢,只有你拥有的分区越多,速度就越慢。在 S3 上添加新数据时运行 ALTER TABLE … ADD PARTITION … 效率更高,因为您知道刚刚添加的内容和位置,因此无需告诉 Athena 扫描整个前缀。直接使用 Glue API 更快,但不幸的是,这需要更多代码。

【讨论】:

    【解决方案2】:

    我通过重命名 s3 文件的前缀解决了这个问题。

    您实际上不能直接在 s3 中重命名或移动文件。通过 mv 命令,您应该创建另一个密钥并删除现有的。

    通过在控制台上运行这段代码,你可以让 Hive 可以理解分区的位置。

    aws s3 --recursive mv s3://***/data/2019/8/7/ s3://***/data/year=2019/month=8/day=7/
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2016-07-13
      • 2021-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多