使用Fastparquet库控制架构

时间:2018-12-29 23:56:34

标签: fastparquet

我将一个大数据文件(〜10GB)分割成多个块,并使用fastparquet库从中创建木地板文件。我正在使用object_encoding属性来强制列类型,该属性基于将列标识为数字或非数字的列的字典(前缀F为数字,其余为非数字)。

基于fastparquet的API文档,我意识到object_encoding仅适用于对象列,但是我为数据框中的所有列创建了数据类型映射(请参见下面的pfschema变量):

pfschema = { k: "int" if v[0] == 'F' else "bytes" for k, v in col.items() }

然后我遍历大块记录并在for循环中创建镶木地板文件(请参见下面的循环内容)

df = pd.DataFrame(records)
df.to_parquet(filepath + 'pq/data.parquet', object_encoding=pfschema, engine='fastparquet', compression='GZIP')

生成文件后,我尝试一起读取它们,但首先我使用以下内容为它们生成_metadata。

filelist = glob.glob(filepath + '/*.parquet')
fp.writer.merge(filelist)

但是,在元数据生成过程中,我看到不兼容的架构错误(如下),因为写入的镶木文件具有某些类型不同的变量。最值得注意的是,某些文件中的 DOUBLE 是其他文件中的 INT64 。是否有可能在写操作期间完全控制最终模式,并且理想地能够为所有列而不是仅对象列设置模式(类似于pyarrow库使用schema属性的方式?)?我认为fasparquet中的schema属性是只读的吗?任何帮助表示赞赏。

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-27-6c5dde5d7c34> in <module>()
     10 filelist = glob.glob(filepath + '/*.parquet')
---> 11 fp.writer.merge(filelist)

C:\Software\Anaconda3\lib\site-packages\fastparquet\writer.py in merge(file_list, verify_schema, open_with, root)
   1022     """
   1023     basepath, fmd = metadata_from_many(file_list, verify_schema, open_with,
-> 1024                                        root=root)
   1025 
   1026     out_file = join_path(basepath, '_metadata')

C:\Software\Anaconda3\lib\site-packages\fastparquet\util.py in metadata_from_many(file_list, verify_schema, open_with, root)
    135         for pf in pfs[1:]:
    136             if pf._schema != pfs[0]._schema:
--> 137                 raise ValueError('Incompatible schemas')
    138 
    139     fmd = copy.copy(pfs[0].fmd)  # we inherit "created by" field

ValueError: Incompatible schemas

0 个答案:

没有答案