我正在尝试将镶木地板文件写入s3以运行“复制到Redshift” /镶木地板文件正在正确写入,但是在尝试复制时出现错误:D()
。
错误消息非常清楚,但是我不确定如何将列强制为Column type: DECIMAL(10,2), Parquet schema: optional doubl
类型。
有可能做到吗?编写实木复合地板时,将列Decimal
保留为十进制吗?
value
答案 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个小数)