csv Dask数组-包含numpy数组的列-转换为parquet错误

ddarikpa  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(89)

我有一个dask框架,我试图转换为Parquet文件。这个框架有列是numpy数组,但列类型是“对象”。
当我尝试这样做时:

name_function = lambda x: f"data-{x}.parquet"
data_frame[['numpy_array_col1','numpy_array_col2']].to_parquet('train/',name_function=name_function)

字符串
我得到这个错误:

ArrowTypeError: ("Expected bytes, got a 'numpy.ndarray' object", 'Conversion failed for column INPUT with type object')

During handling of the above exception, another exception occurred:

# Other errors

Can only convert 1-dimensional array values


我试着使用CSV的,它的工作,但我知道它更好地使用Parquet文件,我不知道如果阅读CSV的将提高逻辑或语法错误,因为模糊的列类型。

data_frame[['numpy_array_col1','numpy_array_col2']].to_csv('train/train-*.csv')


更新:当阅读csv文件时,numpy数组变成了string类型,所以我必须将它们转换回numpy数组。
我也试

df.to_parquet('somefile', engine='pyarrow')


同样的事情发生

vcudknz3

vcudknz31#

我尝试了这个解决方法。首先,你将dask的数组中的所有numpy数组扁平化。然后,你用pyArrow的列表数据表写入parquet文件,指定一个模式。最后,你可以读取文件,但你必须将所有以前的数组重塑为它们的原始形状。

import numpy as np
import pandas as pd
import dask.dataframe as dd
import pyarrow as pa

a = np.array([[5, 6], [7, 8]]).flatten()
b = np.array([[9, 10], [11, 12]]).flatten()
df = pd.DataFrame({"col1": [a],"col2":[b]})
df.loc[1] = (b,a)

df = dd.from_pandas(df, npartitions=2)

print(df.compute())

name_function = lambda x: f"data-{x}.parquet"
df[['col1','col2']].to_parquet('train/',name_function=name_function,engine='pyarrow',schema={"col1": pa.list_(pa.int32()),"col2": pa.list_(pa.int32())})

df2 = dd.read_parquet(['train/data-0.parquet','train/data-1.parquet'])  
print(df2.compute())

def reshape(x):
    if(x == 'foo'):
        return x
    return x.reshape(2,2) 

df2 = df2.applymap(lambda x:reshape(x)) 
print(df2.compute())
col1             col2
0     [5, 6, 7, 8]  [9, 10, 11, 12]
1  [9, 10, 11, 12]     [5, 6, 7, 8]
              col1             col2
0     [5, 6, 7, 8]  [9, 10, 11, 12]
1  [9, 10, 11, 12]     [5, 6, 7, 8]
                  col1                 col2
0     [[5, 6], [7, 8]]  [[9, 10], [11, 12]]
1  [[9, 10], [11, 12]]     [[5, 6], [7, 8]]

我希望有另一个更简单的解决方案。

相关问题