如何将包含一列数组的 Dask 数据帧写入镶木地板文件
How to write a Dask dataframe containing a column of arrays to a parquet file
我有一个 Dask 数据框,其中一列包含一个 numpy 浮点数组:
import dask.dataframe as dd
import pandas as pd
import numpy as np
df = dd.from_pandas(
pd.DataFrame(
{
'id':range(1, 6),
'vec':[np.array([1.0, 2.0, 3.0, 4.0, 5.0])] * 5
}), npartitions=1)
df.compute()
id vec
0 1 [1.0, 2.0, 3.0, 4.0, 5.0]
1 2 [1.0, 2.0, 3.0, 4.0, 5.0]
2 3 [1.0, 2.0, 3.0, 4.0, 5.0]
3 4 [1.0, 2.0, 3.0, 4.0, 5.0]
4 5 [1.0, 2.0, 3.0, 4.0, 5.0]
如果我尝试将其写成镶木地板,我会收到错误消息:
df.to_parquet('somefile')
....
Error converting column "vec" to bytes using encoding UTF8. Original error: bad argument type for built-in operation
我认为这是因为 'vec' 列的类型为 'object',因此 parquet 序列化程序尝试将其写为字符串。有什么方法可以告诉 Dask DataFrame 或序列化程序该列是一个浮点数组吗?
我发现如果使用 pyarrow 引擎而不是默认的 fastparquet 是可能的:
pip/conda install pyarrow
然后:
df.to_parquet('somefile', engine='pyarrow')
https://github.com/dask/fastparquet/ 的 fastparquet 文档说 "only simple data-types and plain encoding are supported",所以我想这意味着没有数组。
我有一个 Dask 数据框,其中一列包含一个 numpy 浮点数组:
import dask.dataframe as dd
import pandas as pd
import numpy as np
df = dd.from_pandas(
pd.DataFrame(
{
'id':range(1, 6),
'vec':[np.array([1.0, 2.0, 3.0, 4.0, 5.0])] * 5
}), npartitions=1)
df.compute()
id vec
0 1 [1.0, 2.0, 3.0, 4.0, 5.0]
1 2 [1.0, 2.0, 3.0, 4.0, 5.0]
2 3 [1.0, 2.0, 3.0, 4.0, 5.0]
3 4 [1.0, 2.0, 3.0, 4.0, 5.0]
4 5 [1.0, 2.0, 3.0, 4.0, 5.0]
如果我尝试将其写成镶木地板,我会收到错误消息:
df.to_parquet('somefile')
....
Error converting column "vec" to bytes using encoding UTF8. Original error: bad argument type for built-in operation
我认为这是因为 'vec' 列的类型为 'object',因此 parquet 序列化程序尝试将其写为字符串。有什么方法可以告诉 Dask DataFrame 或序列化程序该列是一个浮点数组吗?
我发现如果使用 pyarrow 引擎而不是默认的 fastparquet 是可能的:
pip/conda install pyarrow
然后:
df.to_parquet('somefile', engine='pyarrow')
https://github.com/dask/fastparquet/ 的 fastparquet 文档说 "only simple data-types and plain encoding are supported",所以我想这意味着没有数组。