将压缩文件保存到s3并加载到Athena中

时间:2017-07-03 16:12:34

标签: amazon-web-services amazon-s3 gzip amazon-athena

您好我正在编写一些程序,这些程序将写入一些文件(当时有更多进程),如:

with gzip.open('filename.gz', 'a') as f:
    f.write(json.dumps(some dictionary) + '\n')
    f.flush()

写完后,我上传文件:

s3.meta.client(filename, bucket, destination, filename without .gz)

我想查询来自Athena的数据,在MSCK REPAIR之后一切似乎都很好但是当我尝试选择数据时,我的行是空的。有谁知道我做错了什么?

编辑:我的错误。我忘了将ContentType参数添加到&text;&text;'

3 个答案:

答案 0 :(得分:1)

Athena使用适当的文件扩展名检测文件压缩格式。

因此,如果你上传一个GZIP文件,但删除'.gz'部分(正如我猜你的“s3.meta.client(文件名,存储桶,目的地,没有.gz的文件名)”声明),SerDe无法阅读信息。

如果您将文件重命名为filename.gz,Athena应该能够读取您的文件。

答案 1 :(得分:1)

我已经通过首先在本地保存更大的文件块而不是gzip来解决了这个问题。我重复这个过程,但附加到gziped文件。请注意,最好添加更大的文本块,而不是逐行添加

对于上传,我使用了boto3.transfet.upload_file,其中包含extra_args = {' ContentEncoding':' gzip',' ContentType':' text /平原'}

我忘了第一次添加ContetType,所以s3以不同方式保存它们,Athena给了我错误,说我的JSON格式不正确。

答案 2 :(得分:0)

我建议你把问题分成几个部分。

首先,创建一个未经过压缩的单个JSON文件。将其存储在Amazon S3中,然后使用Athena进行查询。

一旦有效,从命令行手动gzip文件(而不是以编程方式),将文件放入S3并使用Athena进行查询。

如果可行,使用您的代码以编程方式gzip ,然后再试一次。

如果适用于单个文件,请使用多个文件进行尝试。

上述所有内容都可以使用Athena中的相同命令进行测试 - 您只需替换源文件。

这样,你就会知道哪个部分正在扰乱Athena而不会使潜在原因复杂化。