amazon-web-services - AWS Athena/Glue 与 Quicksight 中查询的 JSON 字典列表

标签 amazon-web-services amazon-s3 aws-glue amazon-athena 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 文档时遇到了许多挑战,因此,如果这是一个简单的修复,我深表歉意。

最佳答案

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 存储到 S3 之前先研究一下如何扁平化您的 JSON,例如 flatten_json 。 Athena 可以让您很好地查询嵌套 JSON,但 Quicksight 等其他一些工具可能无法处理复杂的嵌套列。

关于amazon-web-services - AWS Athena/Glue 与 Quicksight 中查询的 JSON 字典列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56227324/

相关文章:

python - 更改 boto3 中的请求重试次数

amazon-web-services - 我应该每次都运行 Glue 爬虫来获取最新数据吗?

amazon-web-services - S3 是否提供任何存储桶策略以在有限的时间内将对象共享给 IAM 用户?

python - 如何在 AWS Glue 中运行查询

snowflake-cloud-data-platform - 您可以使用 AWS Glue 获得永久 IP 地址,以便它可以在 Snowflake 中列入白名单吗?

mysql - AWS DMS 连续复制延迟问题

python - S3 响应错误 : 100 Continue - python (appengine)

java - Amazon S3s key 背后的数据结构(过滤数据结构)

mysql - 使用 Amazon Web Services(EC2 等)托管 CakePHP 应用程序?

amazon-web-services - 是否可以在自定义格式文件上将作业书签与AWS Glue Job一起使用?