ele*_*ore 2 amazon-s3 amazon-web-services amazon-quicksight amazon-athena aws-glue
(这个问题与Store multiple elements in json files in AWS Athena非常相似)
我在 S3 存储桶中有一个 JSON 文件,其结构如下 -
[{"key1": value, "key2": value, "key3": {"key4": value, etc}}, {"key1": value....}]
Run Code Online (Sandbox Code Playgroud)
两个问题:
为什么如果我直接将其发送到 Quicksight,Quicksight 知道如何完美地规范化文件(除非存储桶中存在多个不匹配的文件(这就是我尝试 Athena 的原因)),但 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)
Run Code Online (Sandbox Code Playgroud)
免责声明:我对 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)
Run Code Online (Sandbox Code Playgroud)
请记住,Athena 不喜欢.其中包含键/列名称,因此如果您的数据中有任何键/列名称,您可能需要在将数据存储到 s3 之前修改您的数据。
如果您的 JSON 是嵌套的,正如您的示例所示key3,您可能还需要在使用诸如flatten_json之类的东西将 JSON 存储到 S3 之前先研究一下如何展平您的 JSON 。Athena 可以让您很好地查询嵌套 JSON,但 Quicksight 等其他一些工具可能无法处理复杂的嵌套列。
| 归档时间: |
|
| 查看次数: |
2193 次 |
| 最近记录: |