熊猫-编写拼花地板并将列保留为十进制

时间:2019-06-27 02:01:56

标签: python pandas parquet

我正在尝试将镶木地板文件写入s3以运行“复制到Redshift” /镶木地板文件正在正确写入,但是在尝试复制时出现错误:D()

错误消息非常清楚,但是我不确定如何将列强制为Column type: DECIMAL(10,2), Parquet schema: optional doubl类型。

有可能做到吗?编写实木复合地板时,将列Decimal保留为十进制吗?

value

1 个答案:

答案 0 :(得分:0)

要将列作为十进制值写到Parquet中,它们必须以十进制开头。

数据帧中的值(在此示例中稍作简化)是浮点数,因此它们被写为浮点数:

>>> 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个小数)