Преобразование стандартного файла JSON в формат json -serde с использованием Python и загрузка в корзину AWS S3 для Amazon Athena (Presto, Hive) - PullRequest
0 голосов
/ 06 августа 2020

Я пытаюсь преобразовать файл json в формат json -serde, загружая файл json -serde в корзину AWS S3, используя Python, чтобы Amazon Athena (Presto / Hive) мог читать файл в корзине s3.

Согласно AWS документации продукта, типичный файл json не является допустимым форматом; файл json должен быть в формате json -serde: https://docs.aws.amazon.com/athena/latest/ug/json-serde.html

Локально я могу преобразовать файл json в формат json -serde используя приведенный ниже код:

import json
with open('xx_original_file.json','r',encoding='utf-8') as json_file:
    data = json.load(json_file)
result = [json.dumps(record) for record in data]
with open('xx_new_file.json', 'w') as obj:
    for i in result:
        obj.write(i+'\n')

Есть ли эквивалентный способ сделать это в Python, который позволит мне сохранить новый файл json -serde в корзине s3? Я продолжаю получать сообщение об ошибке со сценарием Python, который я создал до сих пор:

import json
import os
import boto3

s3 = boto3.client('s3')
bucket = 'my_bucket_name'
key = 'xx_original_file.json'
response = s3.get_object(Bucket=bucket,Key=key)
content = response['Body']
jsonObject = json.loads(content.read())
result = [json.dumps(record) for record in jsonObject]
new_results = []
for i in result:
    new_results.append(i+'\n')
new_key = 'xx_new_file.json'
s3.put_object(Bucket=bucket,Key=new_key,Body=new_results)

Сообщение об ошибке: ParamValidationError: Ошибка проверки параметра: Недопустимый тип параметра Body, значение: {json данные} тип: , допустимые типы: , , файловый объект

1 Ответ

0 голосов
/ 06 августа 2020

Это было легко исправить, мне нужно было преобразовать список в строку, а затем преобразовать ее в байты.

import json
import boto3
s3 = boto3.client('s3')
bucket = 'my_bucket_name'
key = 'xx_original_file.json'
response = s3.get_object(Bucket=bucket,Key=key)
content = response['Body']
jsonObject = json.loads(content.read())
result = "\n".join([json.dumps(record) for record in jsonObject])
body = result.encode('utf-8')
new_bucket = 'my_bucket_name'
new_key = 'xx_new_file.json'
s3.put_object(Bucket=new_bucket,Key=new_key,Body=body)
...