Список словарей JSON, запрашиваемых в AWS Athena / Glue vs Quicksight - PullRequest
1 голос
/ 20 мая 2019

(Этот вопрос очень похож на Сохранение нескольких элементов в файлах json в AWS Athena )

У меня есть файл JSON в корзине S3, который структурирован следующим образом -

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

Два вопроса:

  1. Почему, если я отправляю это напрямую в Quicksight, Quicksight знает, как идеально нормализовать файл (если в корзине нет нескольких файлов, которыене совпадают (именно поэтому я пытаюсь Афина), но Афина борется с этим?Я знаю, что это как-то связано с форматированием (каждый словарь находится не в отдельной строке, это список словарей, а не только словари и т. Д.), Но кажется ненужным изменять исходный файл, если в AWS есть другой сервис, которыйумеет разбирать и расплющивать без проблем.

  2. Я использую скрипт Python в Lambda для вызова API, и список словарей - это формат, в котором он представлен. Есть ли простой способ отформатировать файл 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, поэтомумои извинения, если это простое исправление.

1 Ответ

1 голос
/ 23 мая 2019

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, могут не обрабатывать сложные вложенные столбцы.

...