aws athena文件系统中缺少sql表

jm81lzqq  于 2021-06-24  发布在  Hive
关注(0)|答案(2)|浏览(414)

我在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.\u bjdk.gz。我怎样才能解决这个问题?

5ktev3wc

5ktev3wc1#

正如你所发现的(但是对于有同样问题的人来说,有更多的背景) 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 … 总而言之。它很慢,而且只会随着分区的增多而变慢。跑起来效率更高 ALTER TABLE … ADD PARTITION … 当你在s3上添加新的数据时,因为你知道你刚刚添加了什么以及它在哪里,所以告诉雅典娜扫描整个前缀是没有必要的。直接使用glueapi的速度更快,但不幸的是,这需要更多的代码。

fykwrbwg

fykwrbwg2#

我通过重命名s3文件的前缀来解决这个问题。
实际上,不能直接在s3中重命名或移动文件。通过mv命令,您应该创建另一个键并删除现有的键。
通过在控制台上运行此代码,可以使配置单元能够理解分区的位置。

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

相关问题