如何解决尝试查询多个分区文件时 Athena 数据不匹配
我在 S3 中有多个按天分区的镶木地板文件。这些镶木地板文件都为每一列添加了“字符串”类型,我使用以下代码进行了检查:
import awswrangler as wr
results = wr.s3.list_objects('s3://datalake/buildings/upload_year=*/upload_month=*/upload_day=*/*.parquet.gzip')
for result in results:
df = wr.s3.read_parquet(result)
column_not_string = sum([1 if str(x) != 'string' else 0 for x in df.dtypes])
print(column_not_string)
column_not_string
是每个文件中非字符串类型字段的总和。正如预期的那样,文件的每次迭代都返回 0。
然后,AWS glue 爬网程序会爬取这些镶木地板文件。运行爬虫后,我检查新创建的表。所有数据类型都是“字符串”。我检查了分区,分区属性中的每个字段都是“字符串”。
问题:
当我去 Athena 查询新创建的表时:
select *
from "default".buildings;
我收到以下错误:
sql 错误 [100071] [HY000]: [Simba]AthenaJDBC An error has 被 AWS Athena 客户端抛出。 HIVE_BAD_DATA:字段 拼花地板中的 buildingcode 类型 INT64 与类型字符串不兼容 在表模式中定义
我不明白这里发生了什么。如果所有parquet文件元数据都是字符串类型,文件被抓取为字符串,表创建为字符串,那么int类型怎么会出现数据不匹配?
解决方法
当我在 Glue 中查看表分区属性时(AWS Glue > 表 > [你的表] > 查看分区 > 查看属性),我注意到“objectCount”属性在某些分区上为 1,在其他分区上为 > 1 .我注意到,如果我将 SQL 过滤到该特定分区,那么大于 1 的分区也是 Athena 出错的分区。
我检查了该分区的 S3 位置代表,并注意到我有多个对象,而我只期待 1。额外的对象是一个镶木地板文件,其数据类型不是字符串。吸取的教训。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。