您好我正在编写一些程序,这些程序将写入一些文件(当时有更多进程),如:
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;'答案 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而不会使潜在原因复杂化。