AWS Athena / Glue与Quicksight中的字典查询的JSON列表

时间:2019-05-20 19:52:01

标签: json amazon-s3 amazon-athena aws-glue amazon-quicksight

(此问题与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文档时遇到了很多挑战,因此我很抱歉,如果这是一个简单的解决方法。

1 个答案:

答案 0 :(得分:0)

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

Athena的问题在于,每个JSON记录都必须位于自己的行上,而不是包装在JSON数组内。我创建了lambda,以“拉平”我从流中提取的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所示),您可能还需要研究将JSON展平,然后再使用flatten_json之类的东西将其存储在S3中。 Athena可以让您查询嵌套的JSON很好,但是其他一些工具(如Quicksight)可能无法处理复杂的嵌套列。