【问题标题】:JSON List of Dictionaries Querying in AWS Athena/Glue vs Quicksight在 AWS Athena/Glue 与 Quicksight 中查询字典的 JSON 列表
【发布时间】:2019-05-20 19:52:00
【问题描述】:

(这个问题和Store multiple elements in json files in AWS Athena很像)

我在 S3 存储桶中有一个 JSON 文件,其结构如下 -

[{"key1": value, "key2": value, "key3": {"key4": value, etc}}, {"key1": value....}]

两个问题:

  1. 为什么如果我将它直接发送到 Quicksight,Quicksight 知道完美地规范化文件(除非存储桶中有多个文件不匹配(这就是我尝试 Athena 的原因))但雅典娜与之抗争?我知道它与格式有关(每个字典不在自己的行上,它是字典列表而不仅仅是字典等),但如果 AWS 上有其他服务,则似乎没有必要修改原始文件知道如何毫无问题地解析和展平它。

  2. 我在 Lambda 中使用 Python 脚本来调用 API,字典列表就是它的格式。有没有一种简单的方法可以按照 Athena 喜欢的方式格式化 JSON 文件?以下是我当前脚本的示例 -

response = requests.request(method, url, **kwargs)
data_dict = response.json()
data_json = json.dumps(data_dict['results'])
s3.Bucket('bucket_name').put_object(Key = key, Body = data_json)

免责声明:总的来说,我对 AWS/编码相当陌生,并且在尝试理解 AWS 文档时遇到了许多挑战,所以如果这是一个简单的解决方法,我深表歉意。

【问题讨论】:

    标签: amazon-web-services amazon-s3 aws-glue amazon-athena amazon-quicksight


    【解决方案1】:

    Athena 和 Quicksight 有不同的后端,因此这解释了行为上的差异。

    Athena 的问题是每条 JSON 记录都需要在自己的行上,而不是包裹在 JSON 数组中。我创建了 lambdas 来“展平”我从流中提取的 JSON,类似于您的问题。

    以下是一些示例代码,可以帮助您使数据与 Athena 更兼容(此代码未运行/未经测试,但希望它能给您正确的想法):

    client = boto3.client('s3')
    response = requests.request(method, url, **kwargs)
    data_dict = response.json()
    
    with open('/tmp/out.json', 'w') as output:
        for result in data_dict['results']:
            output.write(json.dumps(result))
    
    client.upload_file('/tmp/out.json', 'bucket_name', key)
    

    请记住,Athena 不喜欢其中包含 . 的键/列名称,因此如果您的数据中有任何内容,您可能需要先对数据进行处理,然后再将其存储到 s3 中。

    如果您的 JSON 是嵌套的,如您使用 key3 所指示的示例,您可能还希望在使用类似 flatten_json 将其存储在 S3 中之前查看扁平化您的 JSON。 Athena 可以让您很好地查询嵌套的 JSON,但 Quicksight 等其他一些工具可能无法处理复杂的嵌套列。

    【讨论】:

    • 这太完美了,非常感谢! (我赞成它,但没有足够的声誉让它出现哈哈)
    • 扁平化 JSON 的嵌套字段有两种选择:(1) 在 Athena 中创建 VIEW (2) 或在 QuickSight 的数据源中创建计算字段
    猜你喜欢
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 2021-12-22
    • 2019-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多