(此问题与Store multiple elements in json files in AWS Athena非常相似)
我在S3存储桶中有一个JSON文件,其结构如下-
[{"key1": value, "key2": value, "key3": {"key4": value, etc}}, {"key1": value....}]
两个问题:
为什么直接将其发送给Quicksight,Quicksight知道可以完美地规范化文件(除非存储桶中有多个不匹配的文件(这就是为什么我要尝试Athena的原因))但是雅典娜在挣扎吗?我知道它与格式化有关(每个字典都不在一行上,它是字典的列表,而不仅仅是字典等),但是如果在AWS上有另一个服务可以修改原始文件,则显得不必要知道如何解析和展平它没有问题。
我在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文档时遇到了很多挑战,因此我很抱歉,如果这是一个简单的解决方法。
答案 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)可能无法处理复杂的嵌套列。