我将一个大数据文件(〜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