Панды - написать паркет и оставить столбец в десятичном виде - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь записать файл партера в s3, чтобы выполнить копирование в Redshift / Файл паркет записывается правильно, но при попытке копирования возникла ошибка: Column type: DECIMAL(10,2), Parquet schema: optional doubl.

Сообщение об ошибкедовольно ясно, но я не уверен, как заставить столбец иметь тип Decimal.

Возможно ли это сделать?Сохранить столбец value как десятичный при написании паркета?

from datetime import datetime
import pandas as pd
import decimal as D
import numpy as np

data = [
    {
        "name": "ted",
        "timestamp": datetime.now().isoformat(),
        "actual_data": "2019-06-28 00:00:00",
        "age": 34,
        "value": 0.10
    },
    {
        "name": "barney",
        "timestamp": datetime.now().isoformat(),
        "actual_data": "2019-06-28 10:00:00",
        "age": 35,        
    }
]


df = pd.DataFrame.from_dict(data,)
df['age'] = df['age'].astype(int)
df['value'] = df['value'].fillna(0)
df['value'] = df['value'].astype(np.float, 2)

# df_merged["id"] = df_merged["id"].astype(int)

print(df)

df.to_parquet(f"s3://awesome-parquet-test/data.parquet", index=False)

1 Ответ

0 голосов
/ 11 июля 2019

Чтобы записать столбец как десятичные значения в Parquet, они должны быть десятичными, чтобы начинаться с.

Значения в вашем фрейме данных (здесь для примера немного упрощено) являются числами с плавающей запятой, поэтому они записываются какfloats:

>>> df = pd.DataFrame({'value': [0.1, 0.0]})
>>> df
   value
0    0.1
1    0.0
>>> df['value'].dtype
dtype('float64')
>>> df.to_parquet("test_data.parquet", index=False)
>>> pq.read_metadata("test_data.parquet").schema
<pyarrow._parquet.ParquetSchema object at 0x7f07248334a8>
value: DOUBLE

Но когда мы сначала конвертируем числа с плавающей запятой в Python, мы можем записать десятичные числа в Parquet:

>>> import decimal
>>> df['value_decimal'] = df['value'].astype(str).map(decimal.Decimal)
>>> df['value_decimal'].values
array([Decimal('0.1'), Decimal('0.0')], dtype=object)

>>> df.to_parquet("test_data.parquet", index=False)
>>> pq.read_metadata("test_data.parquet").schema
<pyarrow._parquet.ParquetSchema object at 0x7f073ae52898>
value: DOUBLE
value_decimal: FIXED_LEN_BYTE_ARRAY DECIMAL

Для преобразования в десятичные числа в Python: причиначто я сначала конвертирую в строки, потому что в противном случае десятичная дробь будет использовать полную точность с плавающей запятой (в результате более 10 десятичных дробей)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...