【问题标题】:Save compressed files into s3 and load in Athena将压缩文件保存到 s3 并在 Athena 中加载
【发布时间】:2017-07-03 16:12:33
【问题描述】:

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

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/plain”

【问题讨论】:

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


    【解决方案1】:

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

    因此,如果您上传 GZIP 文件,但删除了“.gz”部分(正如我从您的“s3.meta.client(filename, bucket, destination, filename without .gz)”语句中猜测的那样),SerDe无法读取信息。

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

    【讨论】:

    • 我也试过了,但后来我收到错误消息,说我的 JSON 格式不正确。我没有将 content_encoding 设置为 gzip,所以我想这就是问题所在。立即尝试
    【解决方案2】:

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

    对于上传,我使用 boto3.transfet.upload_file 和 extra_args={'ContentEncoding': 'gzip', 'ContentType': 'text/plain'}

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

    【讨论】:

      【解决方案3】:

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

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

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

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

      如果这适用于单个文件,请尝试使用多个文件

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

      这样,您就可以知道哪个部分让 Athena 心烦意乱,而不会加重潜在原因。

      【讨论】:

      • 感谢您的建议,我已尝试手动 gzip 文件并将其上传到 s3 存储桶,设置内容编码并以这种方式工作。当我以编程方式执行此操作时,在我看来 s3 可以正确保存文件。当我下载它们并解压缩时,一切看起来都很好。将数据加载到 Athena 中,但在我尝试查询它之后,我收到错误消息,表明我的 JSON 不正确。
      • 如果 JSON 文件没有经过 gzip 压缩,Athena 是否可以正常工作?
      猜你喜欢
      • 2017-05-04
      • 2016-03-31
      • 2014-05-22
      • 2014-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多