Athena и Quicksight имеют разные бэк-энды, поэтому это объясняет разницу в поведении.
Проблема с Athena заключается в том, что каждая запись JSON должна находиться на отдельной строке, а не заключаться в массив JSON.Я создал лямбды, чтобы «сгладить» 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 с помощью чего-то вроде flatten_json .Athena позволит вам просто запросить вложенный JSON, но некоторые другие инструменты, такие как Quicksight, могут не обрабатывать сложные вложенные столбцы.