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

JSON List of Dictionaries Querying in AWS Athena/Glue vs Quicksight

(这个问题和很相似)

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

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

两个问题:

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

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

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/coding 还很陌生,在尝试理解 AWS 文档时遇到了很多挑战,如果这是一个简单的修复,我深表歉意。

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

Athena 的问题是每条 JSON 记录都需要独占一行,而不是包含在 JSON 数组中。我已经创建了 "flatten" 出 JSON 的 lambda,我从一个流中提取出来,类似于你的问题。

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

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 不喜欢 keys/column 中包含 . 的名称,因此如果您的数据中有任何数据,您可能需要在将数据存储到 s3 之前对其进行处理。

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