#amazon-s3 #amazon-s3-select
#amazon-s3 #amazon-s3-select
Вопрос:
Я пытаюсь прочитать файл parquet с помощью S3 Select, но сталкиваюсь с проблемами, когда данные содержат пропущенные значения — результаты, возвращаемые из S3 select, пропускают все пропущенные значения, что делает невозможным анализ выходных данных. Воспроизводимый пример с python и boto3:
import pandas as pd
import numpy as np
import boto3
session = boto3.session.Session()
s3 = session.client('s3')
df = pd.DataFrame({'A': [1.0, 2.0, 3.0], 'B': [5, np.nan, 7]})
df['C'] = np.nan
print(df)
# Prints:
# A B C
# 0 1.0 5.0 NaN
# 1 2.0 NaN NaN
# 2 3.0 7.0 NaN
bucket = 'your-test-bucket'
key = 'temp/s3_select/df.parquet'
df.to_parquet(f's3://{bucket}/{key}')
r = s3.select_object_content(
Bucket=bucket,
Key=key,
ExpressionType='SQL',
Expression='select s.A, s.B, s.C from s3object s',
InputSerialization = {'Parquet': {}},
OutputSerialization = {'CSV': {}},
)
records = []
for event in r['Payload']:
if 'Records' in event:
records.append(event['Records']['Payload'].decode('utf-8'))
print(records[0])
# Prints:
# 1.0,5.0
# 2.0
# 3.0,7.0
т.е. все пропущенные значения просто пропускаются.
Есть ли способ получить результат с пропущенными значениями, соответствующим образом закодированными?
Ответ №1:
Это действительно была ошибка в AWS S3, и по состоянию на 9 мая 2019 года она была исправлена. Приведенный выше код теперь выдает
1.0,5.0,
2.0,,
3.0,7.0,